이 글은 주로 PHP의 pcntl 프로세스 제어의 다중 프로세스 소비 모델을 소개합니다. 이제 필요한 친구들이 참고할 수 있도록 공유하겠습니다.
부모 프로세스는 하위 프로세스의 종료를 기다리고 제어합니다
부모 프로세스가 시작된 후 , 하위 프로세스의 pid를 직접 얻은 다음 하위 프로세스가 분기된 후 비즈니스 소비 코드를 직접 시작한 다음 종료(0)하고 상위 프로세스 pcntl_wait가 기다립니다. 모든 종료 후 상위 프로세스가 종료됩니다.
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('进程fork失败'); } 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의 PC ntl 프로세스 제어 pcntl_fork
위 내용은 PHP의 pcntl 프로세스 제어 다중 프로세스 소비 모델의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!