수색…


내장 된 포크 기능을 이용한 멀티 프로세싱

내장 함수를 사용하여 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 processSIGKILL 신호를 사용하여 SIGKILL 될 수 없다는 점도 주목할 가치가 있습니다.

프로세스 간 통신

프로세스 간 통신을 통해 프로그래머는 서로 다른 프로세스간에 통신 할 수 있습니다. 예를 들어 bash 명령을 실행하고 출력을 인쇄 할 수있는 PHP 응용 프로그램을 작성해야한다고 생각해 봅시다. 우리는 명령을 실행하고 통신 할 수있는 자원을 반환하는 proc_open 을 사용할 것입니다. 다음 코드는 php 에서 bashpwd 를 실행하는 기본 구현을 보여줍니다.

<?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 ()를 사용하여 자식 프로세스를 닫는 것을 항상 기억하십시오.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow