> 백엔드 개발 > PHP 튜토리얼 > PHP의 pcntl 프로세스 제어 다중 프로세스 소비 모델

PHP의 pcntl 프로세스 제어 다중 프로세스 소비 모델

不言
풀어 주다: 2023-04-02 18:58:02
원래의
1307명이 탐색했습니다.

이 글은 주로 PHP의 pcntl 프로세스 제어의 다중 프로세스 소비 모델을 소개합니다. 이제 필요한 친구들이 참고할 수 있도록 공유하겠습니다.

Multi -프로세스 소비 모델

부모 프로세스는 하위 프로세스의 종료를 기다리고 제어합니다

아이디어 정리

부모 프로세스가 시작된 후 , 하위 프로세스의 pid를 직접 얻은 다음 하위 프로세스가 분기된 후 비즈니스 소비 코드를 직접 시작한 다음 종료(0)하고 상위 프로세스 pcntl_wait가 기다립니다. 모든 종료 후 상위 프로세스가 종료됩니다.

code#🎜 🎜#
const NEWLINE = "\n\n";

if (strtolower(php_sapi_name()) != 'cli') {
    die("请在cli模式下运行");
}

$bizPath = "./childBiz/";

if (!is_dir($bizPath)) {
    @mkdir($bizPath, 0755, true);
}

$child = [];

$index = 0;
$loop = 10; //子进程的数量

//如果是资源类型的变量,父子进程会共享
//$f = fopen("./pcntl_fork_2.php", "r");

while ($index < $loop) {

    echo "当前进程:" . getmypid() . NEWLINE;

    $pid = pcntl_fork(); //fork出子进程

    //fork后父进程会走自己的逻辑,子进程从处开始走自己的逻辑,堆栈信息会完全复制给子进程内存空间,父子进程相互独立

    if ($pid == -1) { // 创建错误,返回-1

        die(&#39;进程fork失败&#39;);

    } else if ($pid) { // $pid > 0, 如果fork成功,返回子进程id

        //获取创建的子进程
        $child[$pid] = $pid;
        echo "{$pid} child create!" . microtime(true) . NEWLINE;

    } else { // $pid = 0

        // 子进程逻辑
        $sleepTime = rand(5, 18);
        sleep($sleepTime);
        $time = microtime(true);
        file_put_contents($bizPath.getmypid().".log", $time . ":" . $index . PHP_EOL, FILE_APPEND);
        exit(0);
    }
    $index++;
}

while (count($child)) {
    //阻塞等待
    $pid = pcntl_wait($status);
    $time = microtime(true);
    file_put_contents("./father.log", $time . ":" . $pid . ":" . $status . PHP_EOL, FILE_APPEND);
    if ($pid > 0) {
        unset($child[$pid]);
    }
    if ($pid == -1) {
        unset($child);
    }
//    foreach ($child as $k => $pid) {
//        //不阻塞循环判断 WNOHANG表示如果没有子进程退出立刻返回
//        $res = pcntl_waitpid($pid, $status, WNOHANG);
//        $time = microtime(true);
//        file_put_contents("./father.log", $time . ":" . $pid . ":" . $res . ":" . $status . PHP_EOL, FILE_APPEND);
//        if (-1 == $res || $res > 0) {
//            unset($child[$k]);
//        }
//    }
}

//fclose($f);
//主进程退出
exit(0);
로그인 후 복사

위 내용이 이 글의 전체 내용입니다. 더 많은 관련 내용을 보시려면 PHP 중국어 사이트를 주목해주세요!

관련 권장 사항:

PHP의 pcntl 프로세스 제어 pcntl_wait

PHP의 PC ntl 프로세스 제어 pcntl_fork

위 내용은 PHP의 pcntl 프로세스 제어 다중 프로세스 소비 모델의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿