PHP 多進程的實現代碼一例

來源:互聯網
上載者:User
  1. //while(1)//迴圈採用3個進程
  2. //{
  3. //declare(ticks=1);
  4. $bWaitFlag = FALSE; // 是否等待進程結束
  5. //$bWaitFlag = TRUE; // 是否等待進程結束
  6. $intNum = 3; // 進程總數
  7. $pids = array(); // 進程PID數組
  8. for($i = 0; $i <$intNum; $i++){
  9. // 產生子進程,而且從當前行之下開試運行代碼,而且不繼承父進程的資料資訊
  10. $pids[$i] = pcntl_fork();
  11. /*if($pids[$i])//父進程
  12. {
  13. //echo $pids[$i]."parent"."$i -> " . time(). "\n";
  14. }
  15. */
  16. if($pids[$i] == -1){
  17. echo "couldn't fork". "\n";
  18. }elseif(!$pids[$i]){
  19. sleep(1);
  20. echo "\n"."第".$i."個進程 -> " . time(). "\n";
  21. //$url=" http://xxx/comments.php?p=".$i;//抓取頁面的例子
  22. //$content = file_get_contents($url);
  23. //file_put_contents('message.txt',$content);
  24. //echo "\n"."第".$i."個進程 -> " ."抓取頁面".$i."-> " . time()."\n";
  25. exit(0);//子進程要exit否則會進行遞迴多進程,父進程不要exit否則終止多進程
  26. }
  27. if ($bWaitFlag){
  28. pcntl_waitpid($pids[$i], $status, WUNTRACED);
  29. echo "wait $i -> " . time() . "\n";
  30. }
  31. }
  32. //sleep(1);
  33. } //by bbs.it-home.org
  34. ?>
複製代碼

fork:作業系統會複製一個與父進程完全相同的子進程,雖說是父子關係,但是在作業系統看來,他們更像是兄弟關係,這兩個進程共用代碼空間,但是資料空間是相互獨立的,子進程資料空間的內容是父進程的完整拷貝,指令指標也完全相同。但只用一點不同,如果fork成功, 子進程fork的傳回值是0 父進程中fork的傳回值是子進程的進程號,如果fork不成功,父進程會返回錯,

2個進程一直同時運行,而且步調一致,在fork之後,他們分別作不同的工作,也就是分岔了。這也是fork為什麼叫fork的原因。

至於那一個最先運行,可能與作業系統有關,而且這個問題在實際應用中並不重要,如果需要父子進程協同,可以通過原語的辦法解決。

fork前父進程的東西子進程可以繼承,而在fork後子進程沒有任何和父進程的繼承關係了。在子進程裡建立的東西是子進程的,在父進程建立的東西是父進程的。可以完全看成兩個進程。

在程式段裡用了fork();之後程式出了分岔,派生出了兩個進程。具體哪個先運行就看該系統的調度演算法了。

可以這麼認為,在運行到”pid=fork();”時系統派生出一個跟主程式一模一樣的子進程。該進程的”pid=fork();”一句中 pid得到的就是子進程本身的pid;子進程結束後,父進程的”pid=fork();”中pid得到的就是父進程本身的pid。因此改程式有兩行輸出。

fork()函數複製了當前進程的PCB,並向父進程返回了派生子進程的pid。而且根據上面”corand”兄的提示,父子進程並行,列印語句的 先後完全看系統的調度演算法。列印的內容控制則靠pid變數來控制。因為我們知道fork()向父進程返回了派生子進程的pid,是個正整數;而派生子進程 的pid變數並沒有被改變。這一區別使得我們看到了他們的不同輸出。

1,派生子進程的進程,即父進程,其pid不變;

2,對子進程來說,fork返回給它0,但它的pid絕對不會是0;之所以fork返回0給它,是因為它隨時可以調用getpid()來擷取自己的pid;

3,fork之後夫子進程除非採用了同步手段,否則不能確定誰先運行,也不能確定誰先結束。認為子進程結束後父進程才從fork返回的,這是不對的,fork不是這樣的,vfork才這樣。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.