久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

PHP多進程之pcntl_fork的實例詳解

這篇文章主要介紹了PHP多進程編之pcntl_fork的實例詳解的相關資料,希望通過本文能幫助到大家,讓大家理解掌握這部分內容,需要的朋友可以參考下

PHP多進程編之pcntl_fork的實例詳解

其實PHP是支持并發的,只是平時很少使用而已。平時使用最多的應該是使用PHP-FMP調度php進程了吧。

但是,PHP的使用并不局限于做Web,我們完全也可以使用PHP來進行系統工具類的編程,做監控或者是運維。在使用這些方向的時候,我們可以使用到PHP的更多特性,例如并發(多進程)、socket編程等。

那么接下來就說說我遇到的PHP多進程的編程。這個多進程的使用是有一個背景的,下面模糊描述一下背景。

我需要一個監控系統,當然使用PHP語言,監控系統需要監控很多種系統指標,為了讓每個監控指標之間盡量專心的去做自己的事情,就需要單獨使用一個進程去監控一個指標,還有一個進程去讀取配置,拿到配置之后,根據配置去啟動每條進程。

那么,這就需要我所說的多進程了。

  1. 首先啟動一個主進程,主進程用來讀取配置信息。例如,我讀取到了我需要監控5個指標
  2. 接下來主進程啟動5個子進程,分別監控這5個指標。
  3. 創建好5個指標監控進程之后之后,主進程進行監聽配置。
  4. 一旦配置發生改變,殺死之前的進程并重新創建進程。

相對來說比較清晰的邏輯。那么接下來我們就化簡一下操作:簡單的說就是一個主進程創建5個子進程。

首先,創建進程在需要使用php的一個函數pcntl_fork(),這個函數可能有的同學不太熟,不過接觸過Linux C變成的人都知道Linux下有個叫fork()的函數,用來創建子進程。這個函數和Linux下這個函數是一個意思。需要注意的是,這個函數在Linux下才能使用,而且需要安裝pcntl的擴展。

對于這個函數怎么使用,我們可以查閱官方文檔:http://php.net/manual/zh/function.pcntl-fork.php

官方文檔是這樣說的:

pcntl_fork()函數創建一個子進程,這個子進程僅PID(進程號) 和PPID(父進程號)與其父進程不同。fork怎樣在您的系統工作的詳細信息請查閱您的系統 的fork(2)手冊。

成功時,在父進程執行線程內返回產生的子進程的PID,在子進程執行線程內返回0。失敗時,在 父進程上下文返回-1,不會創建子進程,并且會引發一個PHP錯誤。

這樣就可以創建一個子進程了,子進程創建成功以后會執行pcntl_fork()之后的方法。那么對于這個函數的返回值我們如何理解呢?

是這樣的,我們調用函數創建進程的時候,函數執行時有時間的,而新的進程剛好是在函數執行開始和結束之間創建出來的,這樣,新的進程也執行了這個函數,所以函數也需要有返回值。那么對于該函數一次執行之后,父進程和子進程都會受到該函數的返回值,由于父進程創建了子進程,而子進程并沒有創建新的進程,所以子進程對于這個函數的返回結果是沒有的,所以就給他賦了一個0。而父進程創建了子進程,子進程是存在pid的,所以就得到了那個進程的pid。

我們可以寫個程序了解一下:

$pid = pcntl_fork();
var_dump($pid);

這個調用會輸出兩個值,但是我們如果直接print的只能看到一個值,也就是子進程的pid,但是使用var_dump我們就可以看到兩個值,是0和子進程的pid。0這個值就是子進程返回過來的。

那么如何創建進程了解清楚之后,就可以開始創建進程了,我們需要創建5個進程,那么我就循環5次創建進程。得到如下代碼:

 $i=0;
 while($i!=5){
  $pid = pcntl_fork();
  echo $pid."---------hahah".$i++.PHP_EOL;
 }

這樣就寫好了,那么運行一下吧。啊?發現不是5個進程啊,發現有好多個進程,而且最后一個hahah4這個輸出有32個,為什么是32呢?我們算一算。2^5=32,為什么最后的線程數以指數增長了呢?

想發現這個并不難,因為我們之后的每一條都執行了while循環,到最后成了進程的指數增長——也就是說fork的時候把while循環也帶了進去。但是我們只是要5個進程而已。怎么辦呢?

通過之前對函數的研究可以看到,子進程中會返回一個為0的值,那么我們就可以知道,0為子進程的標記。我們可以通過對子進程標記來結束進程執行。所以我們可以將我們的代碼修改為如下形式:

$i=0;
while($i!=5){
 $pid = pcntl_fork();
 echo $pid."---------hahah".$i++.PHP_EOL;
 if ($pid == 0) {
  echo "子進程".PHP_EOL;
  return;
 }
}

因為0其實是對子進程的標記,那么pid這個變量在子進程里實際上是0的,所以當發現pid的值為0的時候,我們就可以斷定我們當前進程為一個子進程,不需要在讓他執行while并創建子進程的子進程了,所以在執行完我們的內容之后就return或者exit退出這個執行就好了。這樣就能保證我們執行創建了5個進程而不是32個了。

如有疑問請留言或者到本站社區交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

【網站聲明】本站除付費源碼經過測試外,其他素材未做測試,不保證完整性,網站上部分源碼僅限學習交流,請勿用于商業用途。如損害你的權益請聯系客服QQ:2655101040 給予處理,謝謝支持。

相關文檔推薦

這篇文章主要介紹了PHP有序表查找之插值查找算法,簡單分析了插值查找算法的概念、原理并結合實例形式分析了php實現針對有序表插值查找的相關操作技巧,需要的朋友可以參考下
下面小編就為大家分享一篇ThinkPHP整合datatables實現服務端分頁的示例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
下面小編就為大家分享一篇PHP實現APP微信支付的實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
這篇文章主要介紹了PHP實現的多維數組排序算法,結合實例形式對比分析了php針對多維數組及帶有鍵名的多維數組進行排序相關操作技巧與注意事項,需要的朋友可以參考下
這篇文章主要為大家詳細介紹了php結合ajaxuploadfile實現無刷新文件上傳功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
本篇文章給大家詳細介紹了PHP開發接口使用RSA進行加密解密方法,對此有興趣的朋友可以學習下。
主站蜘蛛池模板: 久久精品亚洲精品国产欧美 | 国产亚洲一区二区精品 | 丝袜美腿一区二区三区动态图 | 亚洲看片| 午夜精品久久久 | 中文字幕在线中文 | 久久9久| 色一情一乱一伦一区二区三区 | 人人鲁人人莫人人爱精品 | 色爽女| 国产成人免费视频网站高清观看视频 | 午夜影院网站 | k8久久久一区二区三区 | 在线观看日韩av | 2022精品国偷自产免费观看 | 99精品电影 | 久久精品99 | 国产日韩精品久久 | 国产精品一区二区在线 | 香蕉一区 | 国产精品一区在线观看 | 日韩综合网 | 日韩欧美一级 | 国产欧美在线一区二区 | 美女视频一区二区三区 | 日韩欧美一区在线 | 断背山在线观看 | 狠狠操狠狠色 | 九九热在线视频观看这里只有精品 | 亚洲国产成人精品久久久国产成人一区 | 国产激情亚洲 | 日韩三级电影在线看 | 91麻豆精品国产91久久久久久久久 | 一区二区三区在线 | 伊人伊人 | 午夜精品久久久久久久久久久久久 | 日韩精品免费在线观看 | 最新国产在线 | av看看| 永久免费视频 | 91综合网|