티스토리 뷰

배움/PHP

PHP Multi Thread 구현

spaces25 2025. 6. 24. 09:23
반응형

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
링크
«   2025/08   »
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
글 보관함