這篇文章主要介紹了關於php多進程執行任務的說明,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下
需求
對指定數量的多個任務並發執行,並控制進程數
進程&線程:
進程間相互獨立,不影響。
程式碼範例:
<?php$task = 0; //任務id$taskNum = 10; //任務總數$processNumLimit = 2; //子進程總量限制while(true){ //產生分支 $processid = pcntl_fork(); //建立子進程失敗 if( $processid == -1 ){ echo "create process error!\n"; exit(1); } //主進程,獲得子進程pid elseif($processid){ $task++; //下一個任務 $currentProcessid = posix_getpid(); //當前進程的Id $parentProcessid = posix_getppid(); // 父級進程的ID $phpProcessid = getmypid(); //當前php進程的id echo "task:",$task,"\tprocessid:",$processid,"\tcurrentProcessid:",$currentProcessid,"\tparentProcessid:",$parentProcessid,"\tphpProcessid:",$phpProcessid,"\n"; //控制進程數 if($task >= $processNumLimit) { echo "wait chl start!\n"; $exitid = pcntl_wait($status); //等待退出 echo "wait chl end!extid:",$exitid,"\tstatus:",$status,"\n"; } //任務總量控制 if($task >= $taskNum) { echo "taskNum enough!\n"; break; } } //processid=0為新建立的進程 else{ //類比不同任務的不同執行時間長度 $sleep = rand(1, 5); $currentProcessid = posix_getpid(); //當前進程的Id $parentProcessid = posix_getppid(); // 父級進程的ID $phpProcessid = getmypid(); //當前php進程的id echo "task:",$task,"\tprocessid:",$processid,"\tcurrentProcessid:",$currentProcessid,"\tparentProcessid:",$parentProcessid,"\tphpProcessid:",$phpProcessid,"\tsleep:",$sleep,"\tbegin!\n"; sleep($sleep); echo "task:",$task,"\tprocessid:",$processid,"\tcurrentProcessid:",$currentProcessid,"\tparentProcessid:",$parentProcessid,"\tphpProcessid:",$phpProcessid,"\tsleep:",$sleep,"\tend!\n"; exit(0); //子進程執行完後退出,防止進入迴圈建立子進程 }}
執行的結果:
task:1 processid:32225 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224task:0 processid:0 currentProcessid:32225 parentProcessid:32224 phpProcessid:32225 sleep:5 begin!task:2 processid:32226 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224wait chl start!task:1 processid:0 currentProcessid:32226 parentProcessid:32224 phpProcessid:32226 sleep:2 begin!task:1 processid:0 currentProcessid:32226 parentProcessid:32224 phpProcessid:32226 sleep:2 end!wait chl end!extid:32226 status:0task:3 processid:32228 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224wait chl start!task:2 processid:0 currentProcessid:32228 parentProcessid:32224 phpProcessid:32228 sleep:1 begin!task:2 processid:0 currentProcessid:32228 parentProcessid:32224 phpProcessid:32228 sleep:1 end!wait chl end!extid:32228 status:0task:4 processid:32229 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224wait chl start!task:3 processid:0 currentProcessid:32229 parentProcessid:32224 phpProcessid:32229 sleep:2 begin!task:0 processid:0 currentProcessid:32225 parentProcessid:32224 phpProcessid:32225 sleep:5 end!wait chl end!extid:32225 status:0task:5 processid:32270 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224wait chl start!task:4 processid:0 currentProcessid:32270 parentProcessid:32224 phpProcessid:32270 sleep:1 begin!task:3 processid:0 currentProcessid:32229 parentProcessid:32224 phpProcessid:32229 sleep:2 end!wait chl end!extid:32229 status:0task:6 processid:32271 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224wait chl start!task:5 processid:0 currentProcessid:32271 parentProcessid:32224 phpProcessid:32271 sleep:4 begin!task:4 processid:0 currentProcessid:32270 parentProcessid:32224 phpProcessid:32270 sleep:1 end!wait chl end!extid:32270 status:0task:7 processid:32273 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224wait chl start!task:6 processid:0 currentProcessid:32273 parentProcessid:32224 phpProcessid:32273 sleep:1 begin!task:6 processid:0 currentProcessid:32273 parentProcessid:32224 phpProcessid:32273 sleep:1 end!wait chl end!extid:32273 status:0task:8 processid:32274 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224wait chl start!task:7 processid:0 currentProcessid:32274 parentProcessid:32224 phpProcessid:32274 sleep:2 begin!task:5 processid:0 currentProcessid:32271 parentProcessid:32224 phpProcessid:32271 sleep:4 end!task:7 processid:0 currentProcessid:32274 parentProcessid:32224 phpProcessid:32274 sleep:2 end!wait chl end!extid:32274 status:0task:9 processid:32277 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224wait chl start!wait chl end!extid:32271 status:0task:8 processid:0 currentProcessid:32277 parentProcessid:32224 phpProcessid:32277 sleep:2 begin!task:10 processid:32278 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224wait chl start!task:9 processid:0 currentProcessid:32278 parentProcessid:32224 phpProcessid:32278 sleep:2 begin!task:8 processid:0 currentProcessid:32277 parentProcessid:32224 phpProcessid:32277 sleep:2 end!task:9 processid:0 currentProcessid:32278 parentProcessid:32224 phpProcessid:32278 sleep:2 end!wait chl end!extid:32277 status:0taskNum enough
執行分析:
在pcntl_fork出建立子進程後,子進程執行功能代碼,父進程繼續遞增任務id,建立下一個任務進程;
通過pcntl_wait等待有子進程執行完畢退出後,再新建立進程,實現進程總數的控制;
在主進程完成建立後,通過break退出迴圈。此時可能有子進程繼續執行。
相關函數:
pcntl_fork
在當前進程當前位置產生分支(子進程)。成功時,在父進程執行線程內返回產生的子進程的PID,在子進程執行線程內返回0。失敗時,在 父進程上下文返回-1,不會建立子進程,並且會引發一個PHP錯誤。
pcntl_wait
等待或返回fork的子進程狀態。wait函數颳起當前進程的執行直到一個子進程退出或接收到一個訊號要求中斷當前進程或調用一個訊號處理函數。 如果一個子進程在調用此函數時已經退出(俗稱殭屍進程),此函數立刻返回。子進程使用的所有系統資源將 被釋放。
其他:
1.殭屍進程及孤兒進程的問題
部分殭屍進程被pcntl_wait擷取狀態並釋放資源,未接管的進程在主進程退出後成為孤兒進程。孤兒進程被init進程收養,完成wait的狀態擷取和資源釋放。
以上就是本文的全部內容,希望對大家的學習有所協助,更多相關內容請關注topic.alibabacloud.com!