摘要:說(shuō)明函數(shù)創(chuàng)建一個(gè)子進(jìn)程,這個(gè)子進(jìn)程僅進(jìn)程號(hào)和父進(jìn)程號(hào)與其父進(jìn)程不同。返回值成功時(shí),在父進(jìn)程執(zhí)行線程內(nèi)返回產(chǎn)生的子進(jìn)程的,在子進(jìn)程執(zhí)行線程內(nèi)返回。失敗時(shí),在父進(jìn)程上下文返回,不會(huì)創(chuàng)建子進(jìn)程,并且會(huì)引發(fā)一個(gè)錯(cuò)誤。
pcntl 簡(jiǎn)介
PHP的進(jìn)程控制支持實(shí)現(xiàn)了Unix方式的進(jìn)程創(chuàng)建, 程序執(zhí)行, 信號(hào)處理以及進(jìn)程的中斷。 進(jìn)程控制不能被應(yīng)用在Web服務(wù)器環(huán)境,當(dāng)其被用于Web服務(wù)環(huán)境時(shí)可能會(huì)帶來(lái)意外的結(jié)果。
這份文檔用于闡述每個(gè)進(jìn)程控制函數(shù)的通常用法。關(guān)于Unix進(jìn)程控制的更多信息建議您查閱 系統(tǒng)文檔中關(guān)于fork(2),waitpid(2),signal(2)等的部分或更全面的參考資料比如 《Unix環(huán)境高級(jí)編程》(作者:W. Richard Stevens,Addison-Wesley出版)。
PCNTL現(xiàn)在使用了ticks作為信號(hào)處理的回調(diào)機(jī)制,ticks在速度上遠(yuǎn)遠(yuǎn)超過(guò)了之前的處理機(jī)制。 這個(gè)變化與“用戶ticks”遵循了相同的語(yǔ)義。您可以使用declare() 語(yǔ)句在程序中指定允許發(fā)生回調(diào)的位置。這使得我們對(duì)異步事件處理的開(kāi)銷最小化。在編譯PHP時(shí) 啟用pcntl將始終承擔(dān)這種開(kāi)銷,不論您的腳本中是否真正使用了pcntl。
有一個(gè)調(diào)整是PHP 4.3.0之前的所有pcntl腳本要使其工作,要么在期望允許回調(diào)的(代碼)部分使用 declare() ,要么使用declare()新的全局語(yǔ)法 使其在整個(gè)腳本范圍有效。
Note: 此擴(kuò)展在 Windows 平臺(tái)上不可用。
官方文檔pcntl官方文檔
pcntl_fork# 來(lái)源官方 PHP 4 >= 4.1.0, PHP 5, PHP 7) pcntl_fork — 在當(dāng)前進(jìn)程當(dāng)前位置產(chǎn)生分支(子進(jìn)程)。譯注:fork是創(chuàng)建了一個(gè)子進(jìn)程,父進(jìn)程和子進(jìn)程 都從fork的位置開(kāi)始向下繼續(xù)執(zhí)行,不同的是父進(jìn)程執(zhí)行過(guò)程中,得到的fork返回值為子進(jìn)程 號(hào),而子進(jìn)程得到的是0。 說(shuō)明 int pcntl_fork ( void ) pcntl_fork()函數(shù)創(chuàng)建一個(gè)子進(jìn)程,這個(gè)子進(jìn)程僅PID(進(jìn)程號(hào)) 和PPID(父進(jìn)程號(hào))與其父進(jìn)程不同。fork怎樣在您的系統(tǒng)工作的詳細(xì)信息請(qǐng)查閱您的系統(tǒng) 的fork(2)手冊(cè)。 返回值 成功時(shí),在父進(jìn)程執(zhí)行線程內(nèi)返回產(chǎn)生的子進(jìn)程的PID,在子進(jìn)程執(zhí)行線程內(nèi)返回0。失敗時(shí),在 父進(jìn)程上下文返回-1,不會(huì)創(chuàng)建子進(jìn)程,并且會(huì)引發(fā)一個(gè)PHP錯(cuò)誤。代碼
0, 如果fork成功,返回子進(jìn)程id // 父進(jìn)程邏輯 $time = microtime(true); echo "我是父進(jìn)程:{$time}".NEWLINE; } else { // $pid = 0 // 子進(jìn)程邏輯 $time = microtime(true); echo "我是子進(jìn)程:{$time}".NEWLINE; }執(zhí)行結(jié)果
當(dāng)前進(jìn)程:17472 我是父進(jìn)程:1528697500.2961 我是子進(jìn)程:1528697500.2961fork后會(huì)子進(jìn)程先執(zhí)行還是父進(jìn)程先執(zhí)行邏輯呢? 測(cè)試代碼
此處我們調(diào)換上面代碼的父子進(jìn)程的if順序
if ($pid == -1) { // 創(chuàng)建錯(cuò)誤,返回-1 die("進(jìn)程fork失敗"); } else if (!$pid) { // $pid = 0 // 子進(jìn)程邏輯 $time = microtime(true); echo "我是子進(jìn)程:{$time}".NEWLINE; } else if ($pid) { // $pid > 0, 如果fork成功,返回子進(jìn)程id // 父進(jìn)程邏輯 $time = microtime(true); echo "我是父進(jìn)程:{$time}".NEWLINE; }執(zhí)行結(jié)果
當(dāng)前進(jìn)程:17472 我是父進(jìn)程:1528697500.2961 我是子進(jìn)程:1528697500.2961測(cè)試總結(jié)
fork首先會(huì)執(zhí)行父進(jìn)程邏輯再執(zhí)行子進(jìn)程邏輯
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/28792.html
摘要:多進(jìn)程消費(fèi)模型父進(jìn)程等待并控制子進(jìn)程的退出思路整理父進(jìn)程開(kāi)啟后,直接獲取到子進(jìn)程的,然后存入數(shù)組,子進(jìn)程出來(lái)后直接開(kāi)啟業(yè)務(wù)消費(fèi)代碼,然后退出,然后父進(jìn)程等待子進(jìn)程退出,全部退出后父進(jìn)程結(jié)束代碼請(qǐng)?jiān)谀J较逻\(yùn)行子進(jìn)程的數(shù)量如果是資源類型的變量, 多進(jìn)程消費(fèi)模型 父進(jìn)程等待并控制子進(jìn)程的退出 思路整理 父進(jìn)程開(kāi)啟后,直接獲取到子進(jìn)程的pid,然后存入child數(shù)組,子進(jìn)程fork出來(lái)后直接開(kāi)...
摘要:對(duì)編程的理解,應(yīng)該到深入到操作系統(tǒng)級(jí)別。進(jìn)程控制,我一直都沒(méi)有接觸,感覺(jué)好高端,今天啃了一下擴(kuò)展的最簡(jiǎn)單的兩個(gè)函數(shù),有點(diǎn)心得,記錄一下吧,歡迎拋磚。 對(duì)編程的理解,應(yīng)該到深入到操作系統(tǒng)級(jí)別。進(jìn)程控制,我一直都沒(méi)有接觸,感覺(jué)好高端,今天啃了一下pcntl擴(kuò)展的最簡(jiǎn)單的兩個(gè)函數(shù),有點(diǎn)心得,記錄一下吧,歡迎拋磚。新建代碼文件 pcntl_wait.php,如下: $i = 0; ...
摘要:目的綜上所述,我的目標(biāo)就是實(shí)現(xiàn)基于模式實(shí)現(xiàn)的多進(jìn)程管理工具。備注下文中,父進(jìn)程統(tǒng)稱為子進(jìn)程統(tǒng)稱為。最后我們通過(guò)下圖來(lái)簡(jiǎn)單的總結(jié)和描述這個(gè)多進(jìn)程實(shí)現(xiàn)的過(guò)程控制上面實(shí)現(xiàn)了多進(jìn)程和多進(jìn)程的常駐內(nèi)存,那如何去管理呢答案多進(jìn)程通信。 _ | | _ __ __ _ _ __...
摘要:因?yàn)樽舆M(jìn)程一定不會(huì)是組長(zhǎng)進(jìn)程,所以子進(jìn)程可以調(diào)用。主進(jìn)程退出子進(jìn)程繼續(xù)執(zhí)行啦啦啦,啦啦啦,啦啦啦,已經(jīng)變成啦,開(kāi)心一般服務(wù)器軟件都有寫配置項(xiàng),比如以模式運(yùn)行還是以模式運(yùn)行。 [原文地址:https://blog.ti-node.com/blog...] 其實(shí)前面是談過(guò)一次daemon進(jìn)程的,但是并涉及過(guò)多原理,但是并不影響使用。今天打算說(shuō)說(shuō)關(guān)于daemon進(jìn)程更多的二三事,本質(zhì)上說(shuō),如...
摘要:后面每開(kāi)啟一個(gè)子進(jìn)程,會(huì)將子進(jìn)程的存儲(chǔ)到中,用來(lái)后面主進(jìn)程監(jiān)控子進(jìn)程,如果子進(jìn)程意外終止,主進(jìn)程可以重新佛。將當(dāng)前子進(jìn)程設(shè)置為會(huì)話組再次創(chuàng)建子進(jìn)程,為了防止在的系統(tǒng)下重新打開(kāi)控制終端。 wokerman 啟動(dòng)分析 @(學(xué)習(xí))[workerman, php] 前期想說(shuō)的 也是最近才看的代碼,遇到不懂得地方就去google,所以這篇文章里面穿插了很多參考資料,可以直接點(diǎn)擊閱覽。 需要了解一...
閱讀 3268·2023-04-26 01:31
閱讀 1905·2023-04-25 22:08
閱讀 3464·2021-09-01 11:42
閱讀 2837·2019-08-30 12:58
閱讀 2179·2019-08-29 18:31
閱讀 2442·2019-08-29 17:18
閱讀 3074·2019-08-29 13:01
閱讀 2561·2019-08-28 18:22