티스토리 뷰
반응형
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
- reflectionclass
- laravel 테스트
- flask
- php
- 명령어
- ubuntu
- ob_get_contents
- uniqid
- call_user_func
- jp:a
- laravel 12
- Laravel
- swagger
- 비동기
- createfromformat
- facades
- #collect
- 설정
- WSL2
- array_combine
- strict_types
- researcher
- eloquent
- 설치
- mysql
- privatechannel
- wsl
- laravel 11
- curl_multi_init
- PYTHON
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함