摘要:一中函數(shù)概述函數(shù)是中用于創(chuàng)建子進(jìn)程的一個(gè)函數(shù),返回創(chuàng)建的子進(jìn)程的。主進(jìn)程進(jìn)行業(yè)務(wù)分發(fā)操作,子進(jìn)程進(jìn)行具體的業(yè)務(wù)邏輯執(zhí)行。
一、php中pcntl_fork函數(shù)概述
pcntl_fork()函數(shù)是php中用于創(chuàng)建子進(jìn)程的一個(gè)函數(shù),返回創(chuàng)建的子進(jìn)程的pid。
該函數(shù)創(chuàng)建子進(jìn)程具體fork的過(guò)程:
(1)調(diào)用該函數(shù)即創(chuàng)建一個(gè)子進(jìn)程,創(chuàng)建成功父進(jìn)程返回子進(jìn)程的pid,子進(jìn)程返回0; (2)創(chuàng)建子進(jìn)程實(shí)際上對(duì)父進(jìn)程的一個(gè)拷貝,共享代碼空間,拷貝父進(jìn)程的數(shù)據(jù),也就是說(shuō)父進(jìn)程改變父進(jìn)程的數(shù)據(jù),子進(jìn)程改變子進(jìn)程的數(shù)據(jù)變量等;二、示例代碼分析
代碼示例:
0){ //父進(jìn)程fork成功返回子進(jìn)程的id,此為父進(jìn)程的執(zhí)行邏輯 echo "子進(jìn)程id:".$son_pid.PHP_EOL; }elseif($son_pid = 0){ //子進(jìn)程fork后返回的pid是0,因此為子進(jìn)程執(zhí)行邏輯 }else{ //$son_pid=-1的時(shí)候,代表fork子進(jìn)程失敗 }
以上代碼執(zhí)行后結(jié)果為:
示例代碼分析:
(1)發(fā)現(xiàn)創(chuàng)建了子進(jìn)程之后,系統(tǒng)會(huì)切換到子進(jìn)程中,而子進(jìn)程中的代碼是從含有pcntl_fork函數(shù)的那行執(zhí)行的 (2)創(chuàng)建子進(jìn)程之后,子進(jìn)程的代碼段是拷貝pcntl_fork函數(shù)及之后的代碼段,之前的代碼段并不拷貝,但是具體的數(shù)據(jù)變量子進(jìn)程仍然會(huì)拷貝 (3)可見,fork之后程序會(huì)分叉執(zhí)行,即子進(jìn)程執(zhí)行三、pcntl_fork的業(yè)務(wù)場(chǎng)景舉例
php的多進(jìn)程中,常用pcntl_fork來(lái)實(shí)現(xiàn)并發(fā),多用于一些簡(jiǎn)單工具的實(shí)現(xiàn)。
例如監(jiān)控工具,想要監(jiān)控幾個(gè)不同指標(biāo)的情形,可以使用主進(jìn)程監(jiān)控各指標(biāo)的配置變化,然后對(duì)每個(gè)指標(biāo)分別fork一個(gè)子進(jìn)程來(lái)監(jiān)控其具體的情形,當(dāng)主進(jìn)程發(fā)現(xiàn)指標(biāo)的配置改變則kill掉之前的子進(jìn)程重新創(chuàng)建子進(jìn)程進(jìn)行監(jiān)控。
主進(jìn)程進(jìn)行業(yè)務(wù)分發(fā)操作,子進(jìn)程進(jìn)行具體的業(yè)務(wù)邏輯執(zhí)行。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/31006.html
摘要:說(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ì)...
摘要:輸出結(jié)果子進(jìn)程回收阻塞方式剛剛有么一般我習(xí)慣用加上命令來(lái)查找運(yùn)行著的后臺(tái)進(jìn)程。還有一種方法,既可以回收已經(jīng)結(jié)束的子進(jìn)程,又可以并行。但是這個(gè)時(shí)候,子進(jìn)程會(huì)被交給號(hào)進(jìn)程,號(hào)進(jìn)程成為了這些子進(jìn)程的繼父。 使用多進(jìn)程的優(yōu)點(diǎn): 1. 使用多進(jìn)程, 子進(jìn)程結(jié)束以后, 內(nèi)核會(huì)負(fù)責(zé)回收資源 2. 使用多進(jìn)程,子進(jìn)程異常退出不會(huì)導(dǎo)致整個(gè)進(jìn)程Thread退出. 父進(jìn)程還有機(jī)會(huì)重建流程. ...
摘要:守護(hù)進(jìn)程常常在系統(tǒng)引導(dǎo)裝入時(shí)啟動(dòng),在系統(tǒng)關(guān)閉時(shí)終止。進(jìn)程組有進(jìn)程組來(lái)唯一標(biāo)識(shí)。且該進(jìn)程組不會(huì)因組長(zhǎng)進(jìn)程的退出而受到影響。 使用函數(shù) pcntl_fork();//創(chuàng)建子進(jìn)程 posix_setsid();//設(shè)置當(dāng)前進(jìn)程為進(jìn)程組長(zhǎng) posix_getpid();//獲取進(jìn)程id 例子 workerman中將進(jìn)程 /** * Run as deamon mode. * * @th...
摘要:什么是守護(hù)進(jìn)程守護(hù)進(jìn)程是一種特殊的進(jìn)程,它的生命周期很長(zhǎng),它在后臺(tái)運(yùn)行并且沒有控制終端這樣可以保證守護(hù)進(jìn)程不會(huì)接收到各種來(lái)自終端的信號(hào)。比如等,都會(huì)使用守護(hù)進(jìn)程的形式運(yùn)行,確保可以一直正常的提供服務(wù)。 什么是守護(hù)進(jìn)程 守護(hù)進(jìn)程(daemon)是一種特殊的進(jìn)程,它的生命周期很長(zhǎng),它在后臺(tái)運(yùn)行并且沒有控制終端(這樣可以保證守護(hù)進(jìn)程不會(huì)接收到各種來(lái)自終端的信號(hào))。比如:crontab、ssh...
摘要:用于創(chuàng)建子進(jìn)程。該函數(shù)阻塞當(dāng)前進(jìn)程,只到當(dāng)前進(jìn)程的一個(gè)子進(jìn)程退出或者收到一個(gè)結(jié)束當(dāng)前進(jìn)程的信號(hào)。注意處需要注意子進(jìn)程需要防止子進(jìn)程也進(jìn)入循環(huán)。如果沒有,最終創(chuàng)建的子進(jìn)程不只個(gè)。 本系列文章將向大家講解pcntl_*系列函數(shù),從而更深入的理解進(jìn)程相關(guān)知識(shí)。 PCNTL在PHP中進(jìn)程控制支持默認(rèn)是關(guān)閉的。您需要使用 --enable-pcntl 配置選項(xiàng)重新編譯PHP的 CGI或CLI版本...
閱讀 3904·2021-11-24 09:39
閱讀 1874·2021-11-02 14:41
閱讀 874·2019-08-30 15:53
閱讀 3537·2019-08-29 12:43
閱讀 1267·2019-08-29 12:31
閱讀 3142·2019-08-26 13:50
閱讀 862·2019-08-26 13:45
閱讀 1065·2019-08-26 10:56