国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

PHP多進(jìn)程初探 --- 開篇

wh469012917 / 3498人閱讀

摘要:所以我們只說(shuō)的多進(jìn)程,至于多線程就暫時(shí)放到一邊兒。出來(lái)新進(jìn)程則成為子進(jìn)程,原進(jìn)程則成為父進(jìn)程,子進(jìn)程擁有父進(jìn)程的副本。在父進(jìn)程中返回子進(jìn)程的進(jìn)程,在子進(jìn)程內(nèi)部本身返回?cái)?shù)字。

[原文地址:https://blog.ti-node.com/blog...]

實(shí)際上PHP是有多線程的,只是很多人不常用。使用PHP的多線程首先需要下載安裝一個(gè)線程安全版本(ZTS版本)的PHP,然后再安裝pecl的pthread擴(kuò)展。

實(shí)際上PHP是有多進(jìn)程的,有一些人再用,總體來(lái)說(shuō)php的多進(jìn)程還算湊合,只需要在安裝PHP的時(shí)候開啟pcntl模塊(是不是跟UNIX中的fcntl有點(diǎn)兒.... ....)即可。在*NIX下,在終端命令行下使用php -m就可以看到是否開啟了pcntl模塊。

所以我們只說(shuō)php的多進(jìn)程,至于php多線程就暫時(shí)放到一邊兒。

注意:不要在apache或者fpm環(huán)境下使用php多進(jìn)程,這將會(huì)產(chǎn)生不可預(yù)估的后果。

進(jìn)程是程序執(zhí)行的實(shí)例,舉個(gè)例子有個(gè)程序叫做 “ 病毒.exe ”,這個(gè)程序平時(shí)是以文件形式存儲(chǔ)在硬盤上,當(dāng)你雙擊運(yùn)行后,就會(huì)形成一個(gè)該程序的進(jìn)程。系統(tǒng)會(huì)給每一個(gè)進(jìn)程分配一個(gè)唯一的非負(fù)整數(shù)用來(lái)標(biāo)記進(jìn)程,這個(gè)數(shù)字稱作進(jìn)程ID。當(dāng)該進(jìn)程被殺死或終止后,其進(jìn)程ID就會(huì)被系統(tǒng)回收,然后分配給新的其余的進(jìn)程。

說(shuō)了這么多,這鬼東西有什么用嗎?我平時(shí)用CI、YII寫個(gè)CURD跟這個(gè)也沒啥關(guān)聯(lián)啊。實(shí)際上,如果你了解APACHE PHP MOD或者FPM就知道這些東西就是多進(jìn)程實(shí)現(xiàn)的。以FPM為例,一般都是nginx作為http服務(wù)器擋在最前面,靜態(tài)文件請(qǐng)求則nginx自行處理,遇到php動(dòng)態(tài)請(qǐng)求則轉(zhuǎn)發(fā)給php-fpm進(jìn)程來(lái)處理。如果你的php-fpm配置只開了5個(gè)進(jìn)程,如果處理任意一個(gè)用戶的請(qǐng)求都需要1秒鐘,那么5個(gè)fpm進(jìn)程1秒中就最多只能處5個(gè)用戶的請(qǐng)求。所以結(jié)論就是:如果要單位時(shí)間內(nèi)干活更快更多,就需要更多的進(jìn)程,總之一句話就是多進(jìn)程可以加快任務(wù)處理速度。

在php中我們使用pcntl_fork()來(lái)創(chuàng)建多進(jìn)程(在*NIX系統(tǒng)的C語(yǔ)言編程中,已有進(jìn)程通過(guò)調(diào)用fork函數(shù)來(lái)產(chǎn)生新的進(jìn)程)。fork出來(lái)新進(jìn)程則成為子進(jìn)程,原進(jìn)程則成為父進(jìn)程,子進(jìn)程擁有父進(jìn)程的副本。這里要注意:

子進(jìn)程與父進(jìn)程共享程序正文段

子進(jìn)程擁有父進(jìn)程的數(shù)據(jù)空間和堆、棧的副本,注意是副本,不是共享

父進(jìn)程和子進(jìn)程將繼續(xù)執(zhí)行fork之后的程序代碼

fork之后,是父進(jìn)程先執(zhí)行還是子進(jìn)程先執(zhí)行無(wú)法確認(rèn),取決于系統(tǒng)調(diào)度(取決于信仰)

這里說(shuō)子進(jìn)程擁有父進(jìn)程數(shù)據(jù)空間以及堆、棧的副本,實(shí)際上,在大多數(shù)的實(shí)現(xiàn)中也并不是真正的完全副本。更多是采用了COW(Copy On Write)即寫時(shí)復(fù)制的技術(shù)來(lái)節(jié)約存儲(chǔ)空間。簡(jiǎn)單來(lái)說(shuō),如果父進(jìn)程和子進(jìn)程都不修改這些 數(shù)據(jù)、堆、棧 的話,那么父進(jìn)程和子進(jìn)程則是暫時(shí)共享同一份 數(shù)據(jù)、堆、棧。只有當(dāng)父進(jìn)程或者子進(jìn)程試圖對(duì) 數(shù)據(jù)、堆、棧 進(jìn)行修改的時(shí)候,才會(huì)產(chǎn)生復(fù)制操作,這就叫做寫時(shí)復(fù)制。

在調(diào)用完pcntl_fork()后,該函數(shù)會(huì)返回兩個(gè)值。在父進(jìn)程中返回子進(jìn)程的進(jìn)程ID,在子進(jìn)程內(nèi)部本身返回?cái)?shù)字0。由于多進(jìn)程在apache或者fpm環(huán)境下無(wú)法正常運(yùn)行,所以大家一定要在php cli環(huán)境下執(zhí)行下面php代碼。

第一段代碼,我們來(lái)說(shuō)明在程序從pcntl_fork()后父進(jìn)程和子進(jìn)程將各自繼續(xù)往下執(zhí)行代碼:

 0 ){
          echo "我是父親".PHP_EOL;
        } else if( 0 == $pid ) {
          echo "我是兒子".PHP_EOL;
        } else {
          echo "fork失敗".PHP_EOL;
        }

將文件保存為test.php,然后在使用cli執(zhí)行,結(jié)果如下圖所示:

第二段代碼,用來(lái)說(shuō)明子進(jìn)程擁有父進(jìn)程的數(shù)據(jù)副本,而并不是共享:

 0 ){
          $number += 1;
          echo "我是父親,number+1 : { $number }".PHP_EOL;
        } else if( 0 == $pid ) {
          $number += 2;
          echo "我是父親,number+2 : { $number }".PHP_EOL;
        } else {
          echo "fork失敗".PHP_EOL;
        }

第三段代碼,比較容易讓人思維混亂,pcntl_fork()配合for循環(huán)來(lái)做些東西,問(wèn)題來(lái)了:會(huì)顯示幾次 “ 兒子 ”?

 0 ){
               // do nothing ...
            } else if( 0 == $pid ){
                echo "兒子".PHP_EOL;
            }
        }

上面代碼執(zhí)行結(jié)果如下:

仔細(xì)數(shù)數(shù),竟然是顯示了7次 “ 兒子 ”。好奇怪,難道不是3次嗎?... ...
下面我修改一下代碼,結(jié)合下面的代碼,再思考一下為什么會(huì)產(chǎn)生7次而不是3次。

 0 ){
               // do nothing ...
            } else if( 0 == $pid ){
                echo "兒子".PHP_EOL;
                exit;
            }
        }

執(zhí)行結(jié)果如下圖所示:

前面強(qiáng)調(diào)過(guò):父進(jìn)程和子進(jìn)程將繼續(xù)執(zhí)行fork之后的程序代碼。這里就不解釋,實(shí)在想不明白的,可以動(dòng)手自己畫畫思考一下。

為了避免寫成臭尾理論文兒,這里強(qiáng)行斷篇分割一下,下一章說(shuō)僵尸進(jìn)程和孤兒進(jìn)程的一些恩怨情仇。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/29338.html

相關(guān)文章

  • PHP socket初探 --- 顫顫抖抖開篇libevent(一)

    摘要:原文地址正如標(biāo)題所言,顫顫抖抖開篇。于是只能是你自己,把單子上的個(gè)快遞逐次和收到的對(duì)比一遍,然后對(duì)比完畢后再把這個(gè)單子給了阿梅,然后阿梅繼續(xù)等。剃光頭前的阿梅,就是,不敢正眼看老板娘一眼。剃光頭后的阿梅,就是,可徒手接魔鬼隊(duì)的死亡之球。 [原文地址:https://blog.ti-node.com/blog...] 正如標(biāo)題所言,顫顫抖抖開篇epoll。顫顫抖抖的原因大概也就是以前幾乎...

    levinit 評(píng)論0 收藏0
  • PHP進(jìn)程初探 --- 利用進(jìn)程開發(fā)點(diǎn)兒東西吧

    摘要:主進(jìn)程退出子進(jìn)程繼續(xù)執(zhí)行給進(jìn)程重新起個(gè)名字加入我們出個(gè)子進(jìn)程就可以搞定這些任務(wù),那么出個(gè)子進(jìn)程,同時(shí)父進(jìn)程要負(fù)責(zé)這個(gè)子進(jìn)程的狀態(tài)等。 [原文地址:https://blog.ti-node.com/blog...] 干巴巴地叨逼叨了這么久,時(shí)候表演真正的技術(shù)了! 做個(gè)高端點(diǎn)兒的玩意吧,加入我們要做一個(gè)任務(wù)系統(tǒng),這個(gè)系統(tǒng)可以在后臺(tái)幫我們完成一大波(注意是一大波)數(shù)據(jù)的處理,那么我們自然想到...

    huaixiaoz 評(píng)論0 收藏0
  • PHP進(jìn)程初探 --- 孤兒和僵尸

    摘要:孤兒進(jìn)程是指父進(jìn)程在出子進(jìn)程后,自己先完了。這個(gè)問(wèn)題很尷尬,因?yàn)樽舆M(jìn)程從此變得無(wú)依無(wú)靠無(wú)家可歸,變成了孤兒。在中,父進(jìn)程對(duì)子進(jìn)程的狀態(tài)收集等是通過(guò)和等完成的。這個(gè)函數(shù)返回退出的子進(jìn)程的進(jìn)程或者失敗返回。 [原文地址:https://blog.ti-node.com/blog...] 實(shí)際上,你們一定要記住:PHP的多進(jìn)程是非常值得應(yīng)用于生產(chǎn)環(huán)境具備高價(jià)值的生產(chǎn)力工具。 但我認(rèn)為在正式開...

    xialong 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

wh469012917

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<