pcntl_fork 를 이용한 다중 프로세스 실행
역시나 뭔가의 이름이나 제목을 정하는 것은 쉬운 일이 아니다. 이번에 하려고 한 것은 CUI 에서 실행하는 PHP 스크립트에서 Child Process 를 여러 개 만들어서 처리 속도를 높이기 위한 것이다. DB에서 데이터를 보정하거나 할 때 한 건씩 처리하면 처리 시간이 오래 걸릴 수 밖에 없는데.. Child Process 를 여러 개 실행해서 동시에 실행하게 되면 속도는 빨라진다.
우선 아래의 샘플 코드를 보자.
<?php
function test($pid)
{
$sleep = rand(1, 10);
sleep($sleep);
return [true, ['pid' => $pid, 'sleep' => $sleep]];
}
for ($i = 1; $i <= 5; ++$i) {
$pid = pcntl_fork();
if (!$pid) {
[$r1, $r2] = test($i);
print_r($r2);
exit($i);
}
}
while (pcntl_waitpid(0, $status) != -1) {
$status = pcntl_wexitstatus($status);
echo "Child $status completed\n";
}
?>
pcntl_fork
함수를 이용해 Child Process 를 5개 실행하여 각 프로세스의 결과를 체크하는 것이다. 위 코드를 실행시켜보면 프로세스가 5개 각각 실행되고 서로 다른 sleep 타임 후 프로세스는 종료하게 된다. 코드 상 while
루프에서 프로세스가 모두 종료됐는지 체크 후 결과를 출력하게 된다.