php實現多進程的方法:透過pcntl與posix擴展來實現。根據需求我們可以使用pcntl_fork()函數建立子進程,使用pcntl_wait()函數來阻塞目前進程。
php多重處理需要pcntl,posix擴充支援。
多進程實作只能在cli模式下,在web伺服器環境下,會出現無法預期的結果。
(推薦影片教學:php影片教學)
多重行程核心函式:
pcntl_fork(建立子行程)、pcntl_wait(阻塞目前進程)
詳細介紹:
pcntl_fork:
一次呼叫兩次返回,在父進程中返回子進程pid,在子進程中返回0,出錯返回-1。
pcntl_wait ( int &$status [, int $options ] ):
阻塞目前進程,直到任意一個子進程退出或收到一個結束當前進程的信號,注意是結束當前進程的信號,子進程結束發送的SIGCHLD不算。使用$status傳回子程序的狀態碼,並可以指定第二個參數來說明是否以阻塞狀態呼叫
阻塞方式呼叫的,函數傳回值為子程序的pid,如果沒有子程序回傳值為-1;
非阻塞方式調用,函數還可以在有子進程在運行但沒有結束的子進程時返回0。
pcntl_waitpid ( int $pid , int &$status [, int $options ] )
功能同pcntl_wait,區別為waitpid為等待指定pid的子程序。當pid為-1時pcntl_waitpid與pcntl_wait 一樣。在pcntl_wait和pcntl_waitpid兩個函數中的$status中存了子程序的狀態資訊。
(相關教學建議:php圖文教學)
範例:
php中一個總是保持固定個數的子行程在執行。
根據需求使用pcntl_fork(建立子進程)、pcntl_wait(阻塞目前進程)等核心函數
程式碼實作:
<?php //最大的子进程数量 $maxChildPro = 8; //当前的子进程数量 $curChildPro = 0; //当子进程退出时,会触发该函数,当前子进程数-1 function sig_handler($sig) { global $curChildPro; switch ($sig) { case SIGCHLD: echo 'SIGCHLD', PHP_EOL; $curChildPro--; break; } } //配合pcntl_signal使用,简单的说,是为了让系统产生时间云,让信号捕捉函数能够捕捉到信号量 declare(ticks = 1); //注册子进程退出时调用的函数。SIGCHLD:在一个进程终止或者停止时,将SIGCHLD信号发送给其父进程。 pcntl_signal(SIGCHLD, "sig_handler"); while (true) { $curChildPro++; $pid = pcntl_fork(); if ($pid) { //父进程运行代码,达到上限时父进程阻塞等待任一子进程退出后while循环继续 if ($curChildPro >= $maxChildPro) { pcntl_wait($status); } } else { //子进程运行代码 $s = rand(2, 6); sleep($s); echo "child sleep $s second quit", PHP_EOL; exit; } }
以上是php如何實作多進程的詳細內容。更多資訊請關注PHP中文網其他相關文章!