這篇文章主要介紹了關於PHP的pcntl進程式控制制之pcntl_wait,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下
pcntl_wait 簡介
# 來源官方pcntl_wait — 等待或返回fork的子進程狀態int pcntl_wait ( int &$status [, int $options = 0 ] )wait函數颳起當前進程的執行直到一個子進程退出或接收到一個訊號要求中斷當前進程或調用一個訊號處理函數。 如果一個子進程在調用此函數時已經退出(俗稱殭屍進程),此函數立刻返回。子進程使用的所有系統資源將 被釋放。關於wait在您系統上工作的詳細規範請查看您系統的wait(2)手冊。Note:這個函數等同於以-1作為參數pid 的值並且沒有options參數來調用pcntl_waitpid() 函數。參數statuspcntl_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++;}
loop = 1 執行結果
當前進程:16604我是子進程,當前進程id:16605;父進程id:16604; 當前index:0; 目前時間:1528696774.1978我是父進程,fork的子進程id: 16605;當前進程id:16604;父進程id:15128; 當前index:0; 目前時間:1528696774.2032
loop = 2 執行結果
當前進程: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
loop = 3 執行結果
當前進程: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的邏輯退出,最終結束總進程
以上就是本文的全部內容,希望對大家的學習有所協助,更多相關內容請關注topic.alibabacloud.com!