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