수색…
내장 된 포크 기능을 이용한 멀티 프로세싱
내장 함수를 사용하여 PHP 프로세스를 포크로 실행할 수 있습니다. 쓰레드가 서로 이야기 할 필요가 없다면 병렬 작업을 수행하는 가장 간단한 방법입니다.
이렇게하면 시간이 많이 소요되는 작업 (예 : 다른 서버에 파일 업로드 또는 이메일 전송)을 다른 스레드에 보내 스크립트가 더 빨리로드되고 여러 코어를 사용할 수 있지만 이것이 실제 다중 스레드가 아니며 주 스레드가 아이들이 무엇을하는지 알아라.
Windows에서는 시작하는 각 포크마다 또 다른 명령 프롬프트 팝업이 표시됩니다.
master.php
$cmd = "php worker.php 10";
if(strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') // for windows use popen and pclose
{
pclose(popen($cmd,"r"));
}
else //for unix systems use shell exec with "&" in the end
{
exec('bash -c "exec nohup setsid '.$cmd.' > /dev/null 2>&1 &"');
}
worker.php
//send emails, upload files, analyze logs, etc
$sleeptime = $argv[1];
sleep($sleeptime);
fork를 사용하여 하위 프로세스 만들기
PHP는 자식 프로세스 생성을 위해 pcntl_fork
함수를 내장하고 있습니다. pcntl_fork
는 unix의 fork
와 같습니다. 매개 변수를 취하지 않고 부모와 자식 프로세스를 구별하는 데 사용할 수있는 정수를 반환합니다. 설명을 위해 다음 코드를 고려하십시오.
<?php
// $pid is the PID of child
$pid = pcntl_fork();
if ($pid == -1) {
die('Error while creating child process');
} else if ($pid) {
// Parent process
} else {
// Child process
}
?>
볼 수 있듯이 -1
은 fork의 오류이며 자식은 생성되지 않았습니다. 자식 생성시 별도의 PID
실행되는 두 개의 프로세스가 있습니다.
또 다른 고려 사항은 zombie process
또는 자식 프로세스 전에 부모 프로세스가 완료 될 때 defunct process
프로세스입니다. 좀비 자식 프로세스를 방지하려면 부모 프로세스가 끝날 때 pcntl_wait($status)
를 추가하십시오.
pnctl_wait 는 자식 프로세스가 종료 될 때까지 부모 프로세스의 실행을 일시 중단합니다.
zombie process
가 SIGKILL
신호를 사용하여 SIGKILL
될 수 없다는 점도 주목할 가치가 있습니다.
프로세스 간 통신
프로세스 간 통신을 통해 프로그래머는 서로 다른 프로세스간에 통신 할 수 있습니다. 예를 들어 bash 명령을 실행하고 출력을 인쇄 할 수있는 PHP 응용 프로그램을 작성해야한다고 생각해 봅시다. 우리는 명령을 실행하고 통신 할 수있는 자원을 반환하는 proc_open
을 사용할 것입니다. 다음 코드는 php
에서 bash
로 pwd
를 실행하는 기본 구현을 보여줍니다.
<?php
$descriptor = array(
0 => array("pipe", "r"), // pipe for stdin of child
1 => array("pipe", "w"), // pipe for stdout of child
);
$process = proc_open("bash", $descriptor, $pipes);
if (is_resource($process)) {
fwrite($pipes[0], "pwd" . "\n");
fclose($pipes[0]);
echo stream_get_contents($pipes[1]);
fclose($pipes[1]);
$return_value = proc_close($process);
}
?>
proc_open
은 $descriptor
가있는 bash
명령을 설명자 사양으로 실행합니다. 그런 다음 is_resource
를 사용하여 프로세스의 유효성을 검사합니다. 일단 완료되면 디스크립터 사양에 따라 생성 된 $ pipe 를 사용하여 자식 프로세스와 상호 작용할 수있다.
그런 다음 fwrite
를 사용하여 하위 프로세스의 표준 입력에 쓸 수 있습니다. 이 경우 pwd
다음에 캐리지 리턴 pwd
. 마지막으로 stream_get_contents
는 자식 프로세스의 stdout을 읽는 데 사용됩니다.
자식을 종료하고 종료 상태 코드를 반환하는 proc_close ()를 사용하여 자식 프로세스를 닫는 것을 항상 기억하십시오.