티스토리 뷰
반응형
PHP는 기본적으로 싱글 스레드 기반 언어. 하지만, 멀티스레딩 처리가 필요한 경우 몇 가지 방법으로 구현할 수 있습니다:
✅ PHP에서 멀티스레딩 구현하는 대표적인 방법
1. parallel 확장 사용 (PHP 7.2 이상) — 추천
- 공식적으로 PHP에서 멀티스레딩을 구현하기 위해 도입된 최신 확장입니다.
- pthreads는 PHP 7.2 이후 더 이상 사용되지 않으므로, parallel 사용을 권장합니다.
2. pthreads 확장 (PHP 7.1 이하에서만 지원)
- 오래된 방식이며, PHP 7.2 이상에서는 제거됨.
3. proc_open() / shell_exec()로 프로세스를 분기 처리
- 진짜 멀티스레딩은 아니지만, 병렬 처리 흉내를 낼 수 있습니다.
✅ 방법 1: parallel 확장으로 멀티스레딩 구현 (PHP 7.2+)
🔧 설치
pecl install parallel
또는 Docker에서 사용하는 경우:
Dockerfile
RUN apt-get update && apt-get install -y php-parallel
php.ini에 아래 추가:
extension=parallel.so
📄 예제: 병렬로 두 개의 작업 실행
<?php
use parallel\Runtime;
use parallel\Future;
$task1 = function() {
sleep(2);
return "Task 1 done";
};
$task2 = function() {
sleep(3);
return "Task 2 done";
};
$runtime1 = new Runtime();
$runtime2 = new Runtime();
$future1 = $runtime1->run($task1);
$future2 = $runtime2->run($task2);
echo $future1->value() . PHP_EOL;
echo $future2->value() . PHP_EOL;
🔄 결과:
Task 1 done
Task 2 done
- 병렬로 실행되기 때문에 총 3초만 걸립니다 (아니라면 5초 걸렸을 것임).
✅ 방법 2: proc_open() 또는 shell_exec()로 병렬 실행 흉내
<?php
$cmd1 = 'php task1.php > /tmp/task1.log &';
$cmd2 = 'php task2.php > /tmp/task2.log &';
shell_exec($cmd1);
shell_exec($cmd2);
- task1.php, task2.php는 각각 다른 작업을 수행
- Linux에서 백그라운드로 실행하여 병렬처럼 작동
- 결과는 로그 파일에서 확인 가능
❗ 주의사항
- parallel 확장은 CLI 전용입니다. 웹 서버(Apache/Nginx) 환경에서는 사용 불가입니다.
- 웹에서 병렬 처리를 하고 싶다면 비동기 HTTP 요청 (curl_multi) 혹은 RabbitMQ + Worker 등을 고려해야 합니다.
✅ 대안: 웹 환경에서 병렬 처리 흉내내기
- curl_multi_exec()을 이용해 여러 API나 작업을 병렬적으로 호출할 수 있습니다.
- 예: 이미지 업로드, 외부 API 호출 병렬 처리
요약
| 방법 | 설명 | PHP 버전 |
| parallel | 진짜 멀티스레딩 구현 (CLI에서만) | PHP 7.2+ |
| pthreads | 오래된 멀티스레딩 방식 (비권장) | PHP 7.1 이하 |
| proc_open()/shell_exec() | 병렬 실행 흉내 | 모두 가능 |
| curl_multi_exec() | 병렬 HTTP 요청용 | 모두 가능 |
반응형
'배움 > PHP' 카테고리의 다른 글
| 프록시 설정, User-Agent 설정 등 (0) | 2025.06.24 |
|---|---|
| parallel 웹 크롤러 (0) | 2025.06.24 |
| Laravel 12 Swagger (0) | 2025.06.05 |
| Laravel 11 Swagger (0) | 2025.06.02 |
| Laravel 11 비동기 구현 (0) | 2025.05.27 |
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- php
- eclipse
- ob_get_contents
- OpenAI GPT
- wsl
- reflectionclass
- privatechannel
- uniqid
- laravel 12
- swagger
- WSL2
- createfromformat
- mysql
- PYTHON
- 설정
- laravel 11
- 설치
- Laravel
- 비동기
- ubuntu
- array_combine
- facades
- laravel 테스트
- 명령어
- eloquent
- curl_multi_init
- fromArray
- flask
- call_user_func
- jp:a
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
글 보관함
