中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

PHP多進程編程總結(推薦)
來源:易賢網 閱讀:1013 次 日期:2016-08-12 15:46:55
溫馨提示:易賢網小編為您整理了“PHP多進程編程總結(推薦)”,方便廣大網友查閱!

下面小編就為大家帶來一篇PHP多進程編程總結(推薦)。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。

1. 準備

在動手之前,請確定你用的不是M$ Windows平臺(因為我沒有Windows)。Linux / BSD / Unix應該都是沒問題的。確認好了工作環境以后一起來看看我們需要的PHP模塊是否都有。打開終端輸入下面的命令:

$ php -m

這個命令檢查并打印當前PHP所有開啟的擴展,看一下pcntl和posix是否在輸出的列表中。

1.1. pcntl

如果找不到pcntl,八成是編譯的時候沒把這個擴展編譯進去。如果你和我一樣是編譯安裝的PHP,那么需要重新編譯安裝PHP。在配置的時候記得加上--enable-pcntl參數即可。

$ cd /path/to/php_source_code_dir 

$ ./configure [some other options] --enable-pcntl

$ make && make install

1.2. posix

這貨一般默認就會裝上,只要你編譯的時候沒有加上--disable-posix。

2. 預備知識

在繼續之前,你還需要對Linux多進程有一點了解。多進程是咋回事呢?這里可跟火影忍者里的影分身稍微有點不同。首先,鳴人從小長到大,比如16歲,咳。有一天他發動了影分身,分出了5個他。顯然,這些分身也是16歲的鳴人而不是剛出生啥也不懂就會哭的嬰兒(那叫克隆)。然后,不一樣的地方來了:分身們變成了獨立的人各自去做各自的事,互相之間不再知道其他分身和原身都做了什么(當然不會像動畫片里一樣積累經驗給原身啦)。除非,他們互相之間有交流,不然,只有16歲之前的事情才是他們共同的記憶。

有同學說了,老大你這不坑爹呢么?我又沒看過火影忍者!那你去看一遍好了……

最后,預備知識完了,就是大致了解一下主進程開出來的子進程是怎么回事。子進程的代碼和主進程是完全一樣的,還有一部分一樣的東西就是直到發動影分身之前執行的所有內容。具體請參見《操作系統》課程。

3. 影分身之術

所以呢,沒有點基礎知識怎么能理解卷軸里的內容呢?打開卷軸首先看到了一個單詞:fork。

3.1. fork

叉子?叉子是分岔的,一個變多個嘛!差不多就是這個意思。創建子進程就用這個命令。這里需要用到pcntl_fork()函數。(可以先簡單看一下PHP手冊關于這個函數的介紹。)創建一個PHP腳本:

$pid = pcntl_fork(); // 一旦調用成功,事情就變得有些不同了

if ($pid == -1) {

  die('fork failed');

} else if ($pid == 0) {

} else {

}

pcntl_fork()函數創建一個子進程,子進程和父進程唯一的區別就是PID(進程ID)和PPID(父進程ID)不同。在終端下查看進程用ps命令(問問man看ps怎么用:man ps)。當函數返回值為-1的時候,說明fork失敗了。試試在if前面加一句:echo $pid . PHP_EOL;。運行你的腳本,輸出可能像下面這樣(結果說明子進程和父進程的代碼是相同的):

67789 # 這個是父進程打印的

0   # 這個是子進程打印的

pcntl_fork()函數調用成功后,在父進程中會返回子進程的PID,而在子進程中返回的是0。所以,下面直接用if分支來控制父進程和子進程做不同的事。

3.2. 分配任務

然后我們來說說鳴人16歲那次影分身的事兒,給原身和分身分配兩個簡單的輸出任務:

$parentPid = getmypid(); // 這就是傳說中16歲之前的記憶

$pid = pcntl_fork(); // 一旦調用成功,事情就變得有些不同了

if ($pid == -1) {

  die('fork failed');

} else if ($pid == 0) {

  $mypid = getmypid(); // 用getmypid()函數獲取當前進程的PID

  echo 'I am child process. My PID is ' . $mypid . ' and my father\'s PID is ' .$parentPid . PHP_EOL;

} else {

  echo 'Oh my god! I am a father now! My child\'s PID is ' . $pid . ' and mine is '. $parentPid . PHP_EOL;

}

輸出的結果可能是這樣:

Oh my god! I am a father now! My child's PID is 68066 and mine is 68065

I am child process. My PID is 68066 and my father's PID is 68065

再強調一下,pcntl_fork()調用成功以后,一個程序變成了兩個程序:一個程序得到的$pid變量值是0,它是子進程;另一個程序得到的$pid的值大于0,這個值是子進程的PID,它是父進程。在下面的分支語句中,由于$pid值的不同,運行了不同的代碼。再次強調一下:子進程的代碼和父進程的是一樣的。所以就要通過分支語句給他們分配不同的任務。

3.3. 子進程回收

剛剛有man ps么?一般我習慣用ps aux加上grep命令來查找運行著的后臺進程。其中有一列STAT,標識了每個進程的運行狀態。這里,我們關注狀態Z:僵尸(Zombie)。當子進程比父進程先退出,而父進程沒對其做任何處理的時候,子進程將會變成僵尸進程。Oops,又跟火影里的影分身不一樣了。鳴人的影分身被干死了以后就自動消失了,但是這里的子進程分身死了話還留著一個空殼在,直到父進程回收它。僵尸進程雖然不占什么內存,但是很礙眼,院子里一堆躺著的僵尸怎么都覺得怪怪的。(別忘了它們還占用著PID)

一般來說,在父進程結束之前回收掛掉的子進程就可以了。在pcntl擴展里面有一個pcntl_wait()函數,它會將父進程掛起,直到有一個子進程退出為止。如果有一個子進程變成了僵尸的話,它會立即返回。所有的子進程都要回收,所以多等等也沒關系啦!

3.4. 父進程先掛了

如果父進程先掛了怎么辦?會發生什么?什么也不會發生,子進程依舊還在運行。但是這個時候,子進程會被交給1號進程,1號進程成為了這些子進程的繼父。1號進程會很好地處理這些進程的資源,當它們結束時1號進程會自動回收資源。所以,另一種處理僵尸進程的臨時辦法是關閉它們的父進程。

4. 信號

一般多進程的事兒講到上面就完了,可是信號在系統中確實是一個非常重要的東西。信號就是信號燈,點亮一個信號燈,程序就會做出反應。這個你一定用過,比如說在終端下運行某個程序,等了半天也沒什么反應,可能你會按 Ctrl+C 來關閉這個程序。實際上,這里就是通過鍵盤向程序發送了一個中斷的信號:SIGINT。有時候進程失去響應了還會執行kill [PID]命令,未加任何其他參數的話,程序會接收到一個SIGTERM信號。程序收到上面兩個信號的時候,默認都會結束執行,那么是否有可能改變這種默認行為呢?必須能啊!

4.1. 注冊信號

人是活的程序也是活的,只不過程序需要遵循人制定的規則來運行。現在開始給信號重新設定規則,這里用到的函數是pcntl_signal()(繼續之前為啥不先查查PHP手冊呢?)。下面這段程序將給SIGINT重新定義行為,注意看好:

// 定義一個處理器,接收到SIGINT信號后只輸出一行信息

function signalHandler($signal) {

  if ($signal == SIGINT) {

    echo 'signal received' . PHP_EOL;

  }

}

// 信號注冊:當接收到SIGINT信號時,調用signalHandler()函數

pcntl_signal(SIGINT, 'signalHandler');

while (true) {

  sleep(1);

  // do something

  pcntl_signal_dispatch(); // 接收到信號時,調用注冊的signalHandler()

}

執行一下,隨時按下 Ctrl+C 看看會發生什么事。

4.2. 信號分發

說明一下:pcntl_signal()函數僅僅是注冊信號和它的處理方法,真正接收到信號并調用其處理方法的是pcntl_signal_dispatch()函數。試試把// do something替換成下面這段代碼:

for ($i = 0; $i < 1000000; $i++) {

  echo $i . PHP_EOL;

  usleep(100000);

}

在終端下執行這個腳本,當它不停輸出數字的時候嘗試按下 Ctrl+C 。看看程序有什么響應?嗯……什么都沒有,除了屏幕可能多了個^C以外,程序一直在不停地輸出數字。因為程序一直沒有執行到pcntl_signal_dispatch(),所以就并沒有調用signalHandler(),所以就沒有輸出signal received。

4.3. 版本問題

如果認真看了PHP文檔,會發現pcntl_signal_dispatch()這個函數是PHP 5.3以上才支持的,如果你的PHP版本大于5.3,建議使用這個方法調用信號處理器。5.3以下的版本需要在注冊信號之前加一句:declare(ticks = 1);表示每執行一條低級指令,就檢查一次信號,如果檢測到注冊的信號,就調用其信號處理器。想想就挺不爽的,干嘛一直都檢查?還是在我們指定的地方檢查一下就好。

4.4. 感受僵尸進程

現在我們回到子進程回收的問題上(差點忘了= =")。當你的一個子進程掛了(或者說是結束了),但是父進程還在運行中并且可能很長一段時間不會退出。一個僵尸進程從此站起來了!這時,保護傘公司(內核)發現它的地盤里出現了一個僵尸,這個僵尸是誰兒子呢?看一下PPID就知道了。然后,內核給PPID這個進程(也就是僵尸進程的父進程)發送一個信號:SIGCHLD。然后,你知道怎么在父進程中回收這個子進程了么?提示一下,用pcntl_wait()函數。

4.5. 發送信號

希望剛剛有認真man過kill命令。它其實就是向進程發送信號,在PHP中也可以調用posix_kill()函數來達到相同的效果。有了它就可以在父進程中控制其他子進程的運行了。比如在父進程結束之前關閉所有子進程,那么fork的時候在父進程記錄所有子進程的PID,父進程結束之前依次給子進程發送結束信號即可。

5. 實踐

PHP的多進程跟C還是挺像的,搞明白了以后用其他語言寫的話也大同小異差不多都是這么個情況。如果有空的話,嘗試寫一個小程序,切身體會一下個中滋味:

1.16歲的鳴人發送影分身,分出5個分身

2.每個分身隨機生存10到30秒,每秒都輸出點什么

3.保證原身能感受到分身的結束,然后開動另一個分身,保證最多有5個分身

4.不使用nohup,讓原身在終端關閉后依舊能夠運行

5.把分身數量(5)寫進一個配置文件里,當給原身發送信號(可以考慮用SIGUSR1或SIGUSR2)時,原身讀取配置文件并更新允許的分身最大數量

6.如果分身多了,關閉幾個;如果少了,再分出來幾個

提示:

1.用while循環保證進程運行,注意sleep以免100%的CPU占用

2.運行進程的終端被關閉時,程序會收到一個SIGHUP信號

3.可以用parse_ini_file()函數解析INI配置文件

以上這篇PHP多進程編程總結(推薦)就是小編分享給大家的全部內容了,希望能給大家一個參考

更多信息請查看網絡編程
易賢網手機網站地址:PHP多進程編程總結(推薦)
由于各方面情況的不斷調整與變化,易賢網提供的所有考試信息和咨詢回復僅供參考,敬請考生以權威部門公布的正式信息和咨詢為準!

2026上岸·考公考編培訓報班

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
云南網警備案專用圖標
聯系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權所有:易賢網
云南網警報警專用圖標
中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
国产精品日韩欧美一区二区| 在线视频中文亚洲| 夜夜嗨av一区二区三区中文字幕| 亚洲自拍啪啪| 一区在线视频| 欧美日韩国产在线看| 99国产精品视频免费观看一公开| 欧美色区777第一页| 亚洲精品社区| 国产精品国产三级国产| 亚洲综合色激情五月| 激情偷拍久久| 欧美视频在线播放| 欧美mv日韩mv亚洲| 亚洲专区在线视频| 在线免费观看日本一区| 国产精品久久综合| 午夜亚洲福利| 亚洲作爱视频| 99这里只有精品| 18成人免费观看视频| 国产午夜久久久久| 国产精品视频yy9299一区| 欧美国产日韩一区二区三区| 裸体女人亚洲精品一区| 欧美在线视频网站| 欧美一级电影久久| 久久精品国产亚洲a| 欧美在线视频免费观看| 亚洲女同性videos| 亚洲女人小视频在线观看| 亚洲在线不卡| 欧美一区二区成人6969| 久久精品二区三区| 乱人伦精品视频在线观看| 欧美成人免费在线视频| 欧美日韩国产丝袜另类| 欧美日韩亚洲91| 国内成人精品2018免费看| 尤物九九久久国产精品的特点| 亚洲韩国日本中文字幕| 亚洲色图综合久久| 久久亚洲综合网| 欧美色精品在线视频| 国产在线观看一区| 中文国产成人精品久久一| 亚洲欧美在线aaa| 欧美顶级艳妇交换群宴| 国产精品揄拍500视频| 在线成人h网| 午夜精品一区二区三区在线播放| 久久日韩粉嫩一区二区三区| 欧美午夜免费| 亚洲欧洲精品一区| 久久久久国产一区二区| 黄色精品免费| 午夜久久福利| 国产精品激情| 亚洲精品国精品久久99热| 久久婷婷影院| 亚洲国产欧美日韩精品| 久久经典综合| 国产精品爽爽ⅴa在线观看| 一区二区三区.www| 欧美激情视频给我| 一区二区成人精品| 欧美日韩久久不卡| 在线亚洲精品| 欧美日韩一区二区三区四区在线观看| 精久久久久久久久久久| 久久精品中文字幕一区| 韩日在线一区| 另类酷文…触手系列精品集v1小说| 国产精品―色哟哟| 久久国产精品99国产| 国产精品有限公司| 欧美一区二区三区久久精品茉莉花| 国产精品久久久久影院色老大| 一本久久知道综合久久| 欧美日韩成人一区二区三区| 一区二区日韩免费看| 欧美日韩在线亚洲一区蜜芽| 99视频精品全部免费在线| 国产精品日韩一区| 免费在线观看一区二区| 99伊人成综合| 国产欧美日本一区视频| 久久久国产精品亚洲一区| 91久久精品日日躁夜夜躁国产| 欧美日韩高清在线观看| 久久精品视频在线免费观看| 亚洲美女中文字幕| 国产精品三级视频| 欧美寡妇偷汉性猛交| 午夜在线精品偷拍| 亚洲精品免费一区二区三区| 国产精品美女www爽爽爽| 免费在线观看一区二区| 欧美一级视频精品观看| 亚洲视频精品在线| 99在线精品视频在线观看| 日韩视频不卡中文| 亚洲精品美女免费| 国产最新精品精品你懂的| 国产精品亚洲网站| 欧美日韩调教| 国产精品乱码人人做人人爱| 欧美日韩一卡| 欧美新色视频| 国产偷国产偷亚洲高清97cao| 国产亚洲欧美日韩一区二区| 国外成人在线视频| 亚洲人成毛片在线播放女女| 一二三四社区欧美黄| 欧美一区二区三区喷汁尤物| 久久精品国产视频| 巨胸喷奶水www久久久免费动漫| 麻豆av一区二区三区| 欧美高清视频一区二区三区在线观看 | 欧美日韩国产精品一卡| 欧美福利视频在线| 欧美日韩中字| 国语自产精品视频在线看8查询8| 在线视频成人| 欧美伊人久久久久久午夜久久久久| 久久伊人精品天天| 欧美四级在线观看| 国产尤物精品| 午夜精品久久久久久久久久久久| 亚洲小视频在线观看| 久久精品五月| 欧美日韩八区| 国产伊人精品| 亚洲欧美日韩中文播放| 久久综合久色欧美综合狠狠| 国产日韩专区| 日韩一本二本av| 麻豆成人综合网| 国产午夜精品美女视频明星a级 | 亚洲精品午夜| 久久亚洲欧美| 亚洲韩国日本中文字幕| 久久久久久久一区| 国产欧美一区二区三区国产幕精品 | 亚洲女同在线| 欧美日韩亚洲综合一区| 亚洲精品日产精品乱码不卡| 老司机亚洲精品| 亚洲国产成人在线视频| 久久久久久久久一区二区| 国产日韩欧美高清免费| 性感少妇一区| 国内成人在线| 欧美成人69| 日韩亚洲欧美中文三级| 欧美女同视频| 性欧美8khd高清极品| 亚洲第一区中文99精品| 欧美va亚洲va香蕉在线| 亚洲激情欧美激情| 欧美日韩亚洲视频| 久久成人精品无人区| 1024亚洲| 国产精品尤物| 欧美高清视频www夜色资源网| 99视频一区| 国语自产精品视频在线看| 欧美成人资源| 久久欧美肥婆一二区| 亚洲日韩视频| 国产视频久久| 欧美日韩在线视频一区| 欧美日韩成人| 欧美日韩情趣电影| 欧美承认网站| 欧美大片一区二区三区| 久久久综合网站| 久久免费视频在线| 欧美怡红院视频| 亚洲一区免费看| 欧美夜福利tv在线| 亚洲一区在线直播| 亚洲欧美清纯在线制服| 午夜久久99| 欧美一级专区免费大片| 欧美中文字幕视频| 久久亚洲精品一区| 欧美激情精品久久久六区热门| 免费成人高清| 欧美日韩一级黄| 国产一级久久| 亚洲精品少妇| 亚洲欧美制服另类日韩| 欧美在线视频免费播放| 免费久久99精品国产自| 欧美va亚洲va香蕉在线| 欧美日韩视频一区二区| 国产日韩在线亚洲字幕中文| 激情综合亚洲| 一区二区三区四区五区在线|