摘要:對編程的理解,應(yīng)該到深入到操作系統(tǒng)級(jí)別。進(jìn)程控制,我一直都沒有接觸,感覺好高端,今天啃了一下擴(kuò)展的最簡單的兩個(gè)函數(shù),有點(diǎn)心得,記錄一下吧,歡迎拋磚。
對編程的理解,應(yīng)該到深入到操作系統(tǒng)級(jí)別。進(jìn)程控制,我一直都沒有接觸,感覺好高端,今天啃了一下pcntl擴(kuò)展的最簡單的兩個(gè)函數(shù),有點(diǎn)心得,記錄一下吧,歡迎拋磚。
新建代碼文件 pcntl_wait.php,如下:
$i = 0; while($i < 2) { $pid = pcntl_fork(); // 父進(jìn)程和子進(jìn)程都會(huì)執(zhí)行以下代碼 if ($pid == -1) { // 創(chuàng)建子進(jìn)程錯(cuò)誤,返回-1 die("could not fork"); } else if ($pid) { // 父進(jìn)程會(huì)得到子進(jìn)程號(hào),所以這里是父進(jìn)程執(zhí)行的邏輯 pcntl_wait($status); // 父進(jìn)程必須等待一個(gè)子進(jìn)程退出后,再創(chuàng)建下一個(gè)子進(jìn)程。 $cid = $pid; // 子進(jìn)程的ID $pid = posix_getpid(); // pid 與mypid一樣,是當(dāng)前進(jìn)程Id $myid = getmypid(); $ppid = posix_getppid(); // 進(jìn)程的父級(jí)ID $time = microtime(true); echo "I am parent cid:$cid myid:$myid pid:$pid ppid:$ppid i:$i $time "; } else { // 子進(jìn)程得到的$pid 為0,所以這里是子進(jìn)程的邏輯 $cid = $pid; $pid = posix_getpid(); $ppid = posix_getppid(); $myid = getmypid(); $time = microtime(true); echo "I am child cid:$cid myid:$myid pid:$pid ppid:$ppid i:$i $time "; //exit; //sleep(2); } $i++; }
php -f pcntl_wait.php 運(yùn)行結(jié)果如下:
I am child cid:0 myid:6499 pid:6499 ppid:6498 i:0 1491394182.2065 I am child cid:0 myid:6500 pid:6500 ppid:6499 i:1 1491394182.2077 I am parent cid:6500 myid:6499 pid:6499 ppid:6498 i:1 1491394182.2143 I am parent cid:6499 myid:6498 pid:6498 ppid:3471 i:0 1491394182.2211 I am child cid:0 myid:6501 pid:6501 ppid:6498 i:1 1491394182.222 I am parent cid:6501 myid:6498 pid:6498 ppid:3471 i:1 1491394182.2302
為何是如上運(yùn)行過程?
參考了PHP手冊和網(wǎng)友blog以上代碼能夠循環(huán)產(chǎn)生子進(jìn)程,并且父進(jìn)程會(huì)阻塞等待子進(jìn)程退出,這樣就產(chǎn)生了一個(gè)問題,父進(jìn)程必須等待一個(gè)子進(jìn)程退出后,再創(chuàng)建另外一個(gè)
個(gè)人分析如下:
1.運(yùn)行shell命令(該進(jìn)程ID是3471),生成主進(jìn)程PID為6498
開始循環(huán)i=0
6498 此時(shí)的父進(jìn)程 |fork 6499 父進(jìn)程(6498阻塞),該子進(jìn)程(6499)執(zhí)行 ,輸出:child cid:0 myid:6499 pid:6499 ppid:6498 i:0 1491394182.2065 然后i++ i=1,再次循環(huán)
繼續(xù)循環(huán)i=1
6499 此時(shí)的父進(jìn)程 |fork 6500 父進(jìn)程(6499阻塞),該子進(jìn)程(6500)執(zhí)行,輸出:child cid:0 myid:6500 pid:6500 ppid:6499 i:1 1491394182.2077 然后i++ i=2,本次循環(huán)終止,回到其主進(jìn)程6499 6499 解除阻塞, 此時(shí)i=1(因?yàn)樽枞麜r(shí)i=1),繼續(xù)執(zhí)行 輸出:parent cid:6500 myid:6499 pid:6499 ppid:6498 i:1 1491394182.2143 然后i++ i=2,本次循環(huán)終止,回到其主進(jìn)程6498 6498 解除阻塞, 此時(shí)i=0(因?yàn)樽枞麜r(shí)i=0),繼續(xù)執(zhí)行,輸出:parent cid:6499 myid:6498 pid:6498 ppid:3471 i:0 1491394182.2211 然后i++ i=1,再次循環(huán)
繼續(xù)循環(huán)i=1
6498 此時(shí)的父進(jìn)程 |fork 6501 父進(jìn)程(6498阻塞),該子進(jìn)程(6501)執(zhí)行,輸出:child cid:0 myid:6501 pid:6501 ppid:6498 i:1 1491394182.222 然后i++ i=2,本次循環(huán)終止,回到其主進(jìn)程6498 6498 解除阻塞 此時(shí)i=1(因?yàn)樽枞麜r(shí)為i=1),繼續(xù)執(zhí)行,輸出:parent cid:6501 myid:6498 pid:6498 ppid:3471 i:1 1491394182.2302 然后i++ i=2,本次循環(huán)終止,回到其主進(jìn)程3471,最后命令結(jié)束。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/22661.html
摘要:后面每開啟一個(gè)子進(jìn)程,會(huì)將子進(jìn)程的存儲(chǔ)到中,用來后面主進(jìn)程監(jiān)控子進(jìn)程,如果子進(jìn)程意外終止,主進(jìn)程可以重新佛。將當(dāng)前子進(jìn)程設(shè)置為會(huì)話組再次創(chuàng)建子進(jìn)程,為了防止在的系統(tǒng)下重新打開控制終端。 wokerman 啟動(dòng)分析 @(學(xué)習(xí))[workerman, php] 前期想說的 也是最近才看的代碼,遇到不懂得地方就去google,所以這篇文章里面穿插了很多參考資料,可以直接點(diǎn)擊閱覽。 需要了解一...
摘要:目的綜上所述,我的目標(biāo)就是實(shí)現(xiàn)基于模式實(shí)現(xiàn)的多進(jìn)程管理工具。備注下文中,父進(jìn)程統(tǒng)稱為子進(jìn)程統(tǒng)稱為。最后我們通過下圖來簡單的總結(jié)和描述這個(gè)多進(jìn)程實(shí)現(xiàn)的過程控制上面實(shí)現(xiàn)了多進(jìn)程和多進(jìn)程的常駐內(nèi)存,那如何去管理呢答案多進(jìn)程通信。 _ | | _ __ __ _ _ __...
摘要:多進(jìn)程中與多進(jìn)程相關(guān)的兩個(gè)重要拓展是和。函數(shù)執(zhí)行期間,主進(jìn)程除了等待無法處理其他任務(wù),所以一般不認(rèn)為這是多進(jìn)程編程。回收子進(jìn)程有兩種方式,一種是主進(jìn)程調(diào)用函數(shù)等待子進(jìn)程結(jié)束另外一種是處理信號(hào)。 轉(zhuǎn)載請注明文章出處: https://tlanyan.me/php-review... PHP回顧系列目錄 PHP基礎(chǔ) web請求 cookie web響應(yīng) session 數(shù)據(jù)庫操作 加解...
摘要:運(yùn)行模式實(shí)現(xiàn)進(jìn)程前,需了解常見的的運(yùn)行模式通用網(wǎng)關(guān)接口模式模式命令行模式模塊模式作為服務(wù)器模塊而進(jìn)程則是使用命令行模式運(yùn)行的基本實(shí)現(xiàn)中提供了一個(gè)擴(kuò)展,可以利用操作系統(tǒng)的調(diào)用來實(shí)現(xiàn)多進(jìn)程。 應(yīng)用場景 一些耗時(shí)任務(wù): 大數(shù)據(jù)表分表后的統(tǒng)計(jì)信息功能 分批發(fā)送短信或郵件功能 其他可分目標(biāo)的任務(wù)功能(很多種) 所以我們就需要一個(gè)常駐內(nèi)存的任務(wù)管理工具,為了保證實(shí)時(shí)性,一方面我們讓它一直執(zhí)行任...
摘要:運(yùn)行模式實(shí)現(xiàn)進(jìn)程前,需了解常見的的運(yùn)行模式通用網(wǎng)關(guān)接口模式模式命令行模式模塊模式作為服務(wù)器模塊而進(jìn)程則是使用命令行模式運(yùn)行的基本實(shí)現(xiàn)中提供了一個(gè)擴(kuò)展,可以利用操作系統(tǒng)的調(diào)用來實(shí)現(xiàn)多進(jìn)程。 應(yīng)用場景 一些耗時(shí)任務(wù): 大數(shù)據(jù)表分表后的統(tǒng)計(jì)信息功能 分批發(fā)送短信或郵件功能 其他可分目標(biāo)的任務(wù)功能(很多種) 所以我們就需要一個(gè)常駐內(nèi)存的任務(wù)管理工具,為了保證實(shí)時(shí)性,一方面我們讓它一直執(zhí)行任...
閱讀 2020·2023-04-25 22:50
閱讀 2834·2021-09-29 09:35
閱讀 3390·2021-07-29 10:20
閱讀 3153·2019-08-29 13:57
閱讀 3356·2019-08-29 13:50
閱讀 3032·2019-08-26 12:10
閱讀 3530·2019-08-23 18:41
閱讀 2634·2019-08-23 18:01