這篇文章主要介紹了關於PHP的pcntl進程控制之pcntl_wait,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下
# 来源官方 pcntl_wait — 等待或返回fork的子进程状态 int pcntl_wait ( int &$status [, int $options = 0 ] ) wait函数刮起当前进程的执行直到一个子进程退出或接收到一个信号要求中断当前进程或调用一个信号处理函数。 如果一个子进程在调用此函数时已经退出(俗称僵尸进程),此函数立刻返回。子进程使用的所有系统资源将 被释放。关于wait在您系统上工作的详细规范请查看您系统的wait(2)手册。 Note: 这个函数等同于以-1作为参数pid 的值并且没有options参数来调用pcntl_waitpid() 函数。 参数 status pcntl_wait()将会存储状态信息到status 参数上,这个通过status参数返回的状态信息可以用以下函数 pcntl_wifexited(), pcntl_wifstopped(), pcntl_wifsignaled(), pcntl_wexitstatus(), pcntl_wtermsig()以及 pcntl_wstopsig()获取其具体的值。 options 如果您的操作系统(多数BSD类系统)允许使用wait3,您可以提供可选的options 参数。如果这个参数没有提供,wait将会被用作系统调用。如果wait3不可用,提供参数 options不会有任何效果。options的值可以是0 或者以下两个常量或两个常量“或运算”结果(即两个常量代表意义都有效)。 options可用值 WNOHANG 如果没有子进程退出立刻返回。 WUNTRACED 子进程已经退出并且其状态未报告时返回。 返回值 pcntl_wait()返回退出的子进程进程号,发生错误时返回-1,如果提供了 WNOHANG作为option(wait3可用的系统)并且没有可用子进程时返回0。
<?php /** * Created by PhpStorm. * User: Object * Date: 2018/6/11 * Time: 10:28 */ if (strtolower(php_sapi_name()) != 'cli') { die("请在cli模式下运行"); } $index = 0; $loop = 1; while ($index < $loop) { echo "当前进程:" . getmypid() . PHP_EOL; $pid = pcntl_fork(); //fork出子进程 if ($pid == -1) { // 创建错误,返回-1 die('进程fork失败'); } else if ($pid) { // $pid > 0, 如果fork成功,返回子进程id // 父进程逻辑 pcntl_wait($status); // 父进程必须等待一个子进程退出后,再创建下一个子进程。 $child_id = $pid; //子进程的ID $pid = posix_getpid(); //获取当前进程Id $ppid = posix_getppid(); // 进程的父级ID $time = microtime(true); echo "我是父进程,fork的子进程id: {$child_id};当前进程id:{$pid};父进程id:{$ppid}; 当前index:{$index}; 当前时间:{$time}".PHP_EOL; } else { // $pid = 0 // 子进程逻辑 $cid = $pid; $pid = posix_getpid(); $ppid = posix_getppid(); $myid = getmypid(); $time = microtime(true); echo "我是子进程,当前进程id:{$pid};父进程id:{$ppid}; 当前index:{$index}; 当前时间:{$time}".PHP_EOL; //exit; //sleep(2); } $index++; }
当前进程:16604 我是子进程,当前进程id:16605;父进程id:16604; 当前index:0; 当前时间:1528696774.1978 我是父进程,fork的子进程id: 16605;当前进程id:16604;父进程id:15128; 当前index:0; 当前时间:1528696774.2032
当前进程:16613 我是子进程,当前进程id:16614;父进程id:16613; 当前index:0; 当前时间:1528696781.4751 当前进程:16614 我是子进程,当前进程id:16615;父进程id:16614; 当前index:1; 当前时间:1528696781.4756 我是父进程,fork的子进程id: 16615;当前进程id:16614;父进程id:16613; 当前index:1; 当前时间:1528696781.4802 我是父进程,fork的子进程id: 16614;当前进程id:16613;父进程id:15128; 当前index:0; 当前时间:1528696781.4858 当前进程:16613 我是子进程,当前进程id:16616;父进程id:16613; 当前index:1; 当前时间:1528696781.4863 我是父进程,fork的子进程id: 16616;当前进程id:16613;父进程id:15128; 当前index:1; 当前时间:1528696781.4913
当前进程:16625 我是子进程,当前进程id:16626;父进程id:16625; 当前index:0; 当前时间:1528696787.3334 当前进程:16626 我是子进程,当前进程id:16627;父进程id:16626; 当前index:1; 当前时间:1528696787.3338 当前进程:16627 我是子进程,当前进程id:16628;父进程id:16627; 当前index:2; 当前时间:1528696787.3345 我是父进程,fork的子进程id: 16628;当前进程id:16627;父进程id:16626; 当前index:2; 当前时间:1528696787.3391 我是父进程,fork的子进程id: 16627;当前进程id:16626;父进程id:16625; 当前index:1; 当前时间:1528696787.3434 当前进程:16626 我是子进程,当前进程id:16629;父进程id:16626; 当前index:2; 当前时间:1528696787.3441 我是父进程,fork的子进程id: 16629;当前进程id:16626;父进程id:16625; 当前index:2; 当前时间:1528696787.3496 我是父进程,fork的子进程id: 16626;当前进程id:16625;父进程id:15128; 当前index:0; 当前时间:1528696787.3543 当前进程:16625 我是子进程,当前进程id:16630;父进程id:16625; 当前index:1; 当前时间:1528696787.3548 当前进程:16630 我是子进程,当前进程id:16631;父进程id:16630; 当前index:2; 当前时间:1528696787.3555 我是父进程,fork的子进程id: 16631;当前进程id:16630;父进程id:16625; 当前index:2; 当前时间:1528696787.3599 我是父进程,fork的子进程id: 16630;当前进程id:16625;父进程id:15128; 当前index:1; 当前时间:1528696787.3643 当前进程:16625 我是子进程,当前进程id:16632;父进程id:16625; 当前index:2; 当前时间:1528696787.3649 我是父进程,fork的子进程id: 16632;当前进程id:16625;父进程id:15128; 当前index:2; 当前时间:1528696787.3697
#1.從執行的多次結果得知,程式從外到內創造fork。然後再從內最後一次fork開始退出
2.如一次fork之後,程式的父進程因pcntl_wait阻塞,然後等待本次fork的子進程退出,然後相應的子進程的父進程執行邏輯並退出
3.接著執行本子進程的父進程依序循環2的邏輯退出,最終結束總進程
以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP中文網!
相關推薦:
#以上是PHP的pcntl進程控制之pcntl_wait的詳細內容。更多資訊請關注PHP中文網其他相關文章!