這篇文章主要介紹了關于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:32224
task:0 processid:0 currentProcessid:32225 parentProcessid:32224 phpProcessid:32225 sleep:5 begin!
task:2 processid:32226 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224
wait 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:0
task:3 processid:32228 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224
wait 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:0
task:4 processid:32229 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224
wait 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:0
task:5 processid:32270 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224
wait 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:0
task:6 processid:32271 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224
wait 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:0
task:7 processid:32273 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224
wait 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:0
task:8 processid:32274 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224
wait 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:0
task:9 processid:32277 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224
wait chl start!
wait chl end!extid:32271 status:0
task:8 processid:0 currentProcessid:32277 parentProcessid:32224 phpProcessid:32277 sleep:2 begin!
task:10 processid:32278 currentProcessid:32224 parentProcessid:15053 phpProcessid:32224
wait 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:0
taskNum enough
執行分析:在pcntl_fork出建立子程序後,子程序執行功能代碼,父程序繼續遞增任務id,建立下一個任務程序;
通過pcntl_wait等待有子程序執行完畢退出後,再新建立程序,實作程序總數的控制;
在主程序完成建立後,通過break退出循環。此時可能有子程序繼續執行。
相關函數:
pcntl_fork在目前程序目前位置産生分支(子程序)。成功時,在父程序執行線程内傳回産生的子程序的PID,在子程序執行線程内傳回0。失敗時,在 父程序上下文傳回-1,不會建立子程序,并且會引發一個PHP錯誤。
pcntl_wait等待或傳回fork的子程序狀态。wait函數刮起目前程序的執行直到一個子程序退出或接收到一個信号要求中斷目前程序或調用一個信号處理函數。 如果一個子程序在調用此函數時已經退出(俗稱僵屍程序),此函數立刻傳回。子程序使用的所有系統資源将 被釋放。
其他:
1.僵屍程序及孤兒程序的問題
部分僵屍程序被pcntl_wait擷取狀态并釋放資源,未接管的程序在主程序退出後成為孤兒程序。孤兒程序被init程序收養,完成wait的狀态擷取和資源釋放。
以上就是本文的全部内容,希望對大家的學習有所幫助,更多相關内容請關注PHP中文網!
相關推薦: