php多進程執行任務的說明

來源:互聯網
上載者:User
這篇文章主要介紹了關於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

執行分析:

  1. 在pcntl_fork出建立子進程後,子進程執行功能代碼,父進程繼續遞增任務id,建立下一個任務進程;

  2. 通過pcntl_wait等待有子進程執行完畢退出後,再新建立進程,實現進程總數的控制;

  3. 在主進程完成建立後,通過break退出迴圈。此時可能有子進程繼續執行。

相關函數:

pcntl_fork

在當前進程當前位置產生分支(子進程)。成功時,在父進程執行線程內返回產生的子進程的PID,在子進程執行線程內返回0。失敗時,在 父進程上下文返回-1,不會建立子進程,並且會引發一個PHP錯誤。

pcntl_wait

等待或返回fork的子進程狀態。wait函數颳起當前進程的執行直到一個子進程退出或接收到一個訊號要求中斷當前進程或調用一個訊號處理函數。 如果一個子進程在調用此函數時已經退出(俗稱殭屍進程),此函數立刻返回。子進程使用的所有系統資源將 被釋放。

其他:

1.殭屍進程及孤兒進程的問題

部分殭屍進程被pcntl_wait擷取狀態並釋放資源,未接管的進程在主進程退出後成為孤兒進程。孤兒進程被init進程收養,完成wait的狀態擷取和資源釋放。

以上就是本文的全部內容,希望對大家的學習有所協助,更多相關內容請關注topic.alibabacloud.com!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.