개발 지식

개발 지식

PHP PHP에서 비동기 처리를 흉내내는 방법

페이지 정보

profile_image
영삼이
0건 195회 25-03-28 23:16

본문

✅ 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과의 연동도 고려


댓글목록

등록된 댓글이 없습니다.