PHP PHP에서 비동기 처리를 흉내내는 방법
페이지 정보

영삼이
본문
✅ PHP에서 비동기 처리를 흉내내는 방법
PHP는 기본적으로 싱글 스레드, 동기 실행 구조를 가지며, Node.js처럼 비동기 I/O를 기본 지원하지 않습니다. 하지만 일부 기법을 활용하면 비동기 처리처럼 동작하는 구조를 만들 수 있습니다. 이 글에서는 PHP에서 가능한 비동기 처리 기법을 소개합니다.
🧪 1. proc_open()
또는 shell_exec()
로 백그라운드 작업 실행
[code=php]
// 백그라운드에서 PHP 스크립트 실행
$cmd = 'php worker.php > /dev/null 2>&1 &';
shell_exec($cmd);
[/code]
-
메인 요청과 별개로 서브 프로세스를 실행
-
예: 이메일 발송, 영상 인코딩, 로그 저장 등
worker.php
[code=php]
file_put_contents('log.txt', "비동기 작업 시작됨\n", FILE_APPEND);
sleep(3);
file_put_contents('log.txt', "작업 완료\n", FILE_APPEND);
[/code]
🔁 2. fastcgi_finish_request()
로 응답 먼저 보내고 백그라운드 처리
[code=php]
echo "사용자에게 응답 완료";
fastcgi_finish_request(); // 여기까지 클라이언트 응답 끝남
// 이후 서버에서 백그라운드 작업 수행
sleep(5);
file_put_contents('async.txt', "비동기 로직 완료\n", FILE_APPEND);
[/code]
-
클라이언트는 기다리지 않고 응답받음
-
PHP-FPM + nginx 환경에서만 사용 가능
📤 3. HTTP 요청을 비동기처럼 보내기 (Fire & Forget)
[code=php]
function async_post(string $url, array $data) {
$postdata = http_build_query($data);
$parts = parse_url($url);
$fp = fsockopen($parts['host'], 80, $errno, $errstr, 30);
$out = "POST " . $parts['path'] . " HTTP/1.1\r\n";
$out .= "Host: " . $parts['host'] . "\r\n";
$out .= "Content-Type: application/x-www-form-urlencoded\r\n";
$out .= "Content-Length: " . strlen($postdata) . "\r\n";
$out .= "Connection: Close\r\n\r\n";
$out .= $postdata;
fwrite($fp, $out);
fclose($fp);
}
[/code]
-
API 호출을 기다리지 않고 바로 다음 코드로 진행
-
응답은 무시됨
🧰 4. pcntl_fork()
를 이용한 프로세스 분기 (CLI 전용)
[code=php]
$pid = pcntl_fork();
if ($pid == -1) {
die('fork 실패');
} elseif ($pid) {
echo "부모 프로세스\n";
} else {
sleep(2);
echo "자식 프로세스에서 비동기 작업 수행\n";
}
[/code]
-
병렬 프로세스 생성 가능
-
단, 웹 서버에서는 사용 불가 (CLI 전용)
✅ 요약
기법 | 특징 | 사용 환경 |
---|---|---|
shell_exec() |
백그라운드 스크립트 실행 | 어디서나 가능 |
fastcgi_finish_request() |
응답 후 처리 | PHP-FPM 전용 |
fsockopen() HTTP |
외부 요청 비동기 전송 | REST 호출 |
pcntl_fork() |
병렬 처리 | CLI 전용 |
🧠 정리
-
PHP는 진정한 비동기는 아니지만, 의도된 분리와 병렬 흉내는 가능
-
사용자 응답을 빠르게 반환하고, 후속 작업은 백그라운드에서
-
비동기 성능이 중요한 서비스는 Go, Node.js, Python과의 연동도 고려
- 이전글PHP 8.1 Fibers 고급 사용법 25.03.28
- 다음글PHP에서 고성능 파일 업로드 처리 기법 25.03.28
댓글목록
등록된 댓글이 없습니다.