成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

PHPSocket編程之多進(jìn)程的回聲服務(wù)器

shengguo / 805人閱讀

摘要:所以這次采用多進(jìn)程的方式來(lái)實(shí)現(xiàn)同時(shí)為多個(gè)客戶端提供服務(wù)。而多進(jìn)程則是通過(guò)創(chuàng)建多個(gè)進(jìn)程來(lái)共同完成一件事。如果是子進(jìn)程的執(zhí)行環(huán)境,則返回。正常情況下,子進(jìn)程是通過(guò)父進(jìn)程創(chuàng)建的。以上則是我們的多進(jìn)程回聲服務(wù)程序。

上次的回聲服務(wù)程序有個(gè)很大的缺點(diǎn),就是只能同時(shí)連接一個(gè)客戶端,這明顯是不合理的。

所以這次采用多進(jìn)程的方式來(lái)實(shí)現(xiàn)同時(shí)為多個(gè)客戶端提供服務(wù)。

以下是最終的效果:

                    (通過(guò) ps 命令可以查看到我們創(chuàng)建的工作進(jìn)程)

                (通過(guò) xshell 打開(kāi)多個(gè)終端,并向服務(wù)程序連接多個(gè)客戶端)

在開(kāi)始編碼之前,先介紹一下什么是進(jìn)程。

進(jìn)程,即正在運(yùn)行的占用內(nèi)存的程序,是一個(gè)獨(dú)立的內(nèi)存空間。比如我們?cè)?windows 上打開(kāi)記事本軟件,這個(gè)操作就相當(dāng)于打開(kāi)了一個(gè)進(jìn)程。

而多進(jìn)程則是通過(guò)創(chuàng)建多個(gè)進(jìn)程來(lái)共同完成一件事。

我們本次只需實(shí)現(xiàn)服務(wù)端的程序就行了,客戶端還使用之前的。沒(méi)讀過(guò)之前文章的可以查看歷史文章。

在PHP中,我們可以使用 pcntl_fork 函數(shù)來(lái)實(shí)現(xiàn)創(chuàng)建進(jìn)程。

下面是函數(shù)的原型:

int pcntl_fork ( void )

官方解釋:

成功時(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ò)誤。

為什么說(shuō)是父進(jìn)程執(zhí)行的線程呢,因?yàn)橐粋€(gè)進(jìn)程中至少包含一個(gè)線程 ,而這個(gè)線程則是進(jìn)程的主線程。

父進(jìn)程在調(diào)用 pcntl_fork 時(shí),同時(shí)復(fù)制出一個(gè)獨(dú)立的子進(jìn)程,這個(gè)子進(jìn)程具有父進(jìn)程同樣的上下文。也就是說(shuō)兩個(gè)進(jìn)程共享一個(gè)代碼而已。

下面進(jìn)入編碼環(huán)節(jié):

通過(guò)執(zhí)行 pcntl_fork 函數(shù),同時(shí)復(fù)制了一個(gè)子進(jìn)程,此時(shí),如果上下文是父進(jìn)程的執(zhí)行環(huán)境,則返回值為子進(jìn)程的進(jìn)程號(hào)。如果是子進(jìn)程的執(zhí)行環(huán)境,則返回0。所以下面的if程序結(jié)構(gòu),兩個(gè)分支都執(zhí)行了。

子進(jìn)程同樣還是以前的邏輯,用來(lái)接收客戶端的消息,同時(shí)發(fā)送給客戶端。

倒數(shù)第二行調(diào)用了 pcntl_waitpid 函數(shù),在講解這個(gè)函數(shù)之前我們先了解一下什么是僵尸進(jìn)程。

正常情況下,子進(jìn)程是通過(guò)父進(jìn)程創(chuàng)建的。由于進(jìn)程是互相獨(dú)立的內(nèi)存結(jié)構(gòu),所以父進(jìn)程是不會(huì)知道子進(jìn)程的運(yùn)行狀態(tài)的。子進(jìn)程完成自己的任務(wù)之后,并不能自己退出,這個(gè)時(shí)候需要父進(jìn)程通過(guò)操作系統(tǒng)來(lái)取得子進(jìn)程的狀態(tài),從而回收子進(jìn)程。否則,我們的子進(jìn)程將會(huì)成為一個(gè)垃圾資源,也就是僵尸進(jìn)程。

下面是這個(gè)函數(shù)的函數(shù)原型:

int pcntl_waitpid ( int $pid , int &$status [, int $options = 0 ] )

官方解釋:

等待或返回fork的子進(jìn)程狀態(tài)。

其實(shí)上面的代碼是有問(wèn)題的,在 foreach 中第一次調(diào)用 pcntl_waitpid 之后 ,主進(jìn)程其實(shí)此時(shí)是被阻塞著,一直在等待第一個(gè)子進(jìn)程退出,而其他的子進(jìn)程若此時(shí)異常退出,則并沒(méi)有被主進(jìn)程回收,也就產(chǎn)生了僵尸進(jìn)程。而在實(shí)際的開(kāi)發(fā)中主進(jìn)程還是要做其他的事情的。

所以這里推薦采用非阻塞的方式,很簡(jiǎn)單,只需加上第三個(gè)參數(shù):WNOHANG。即:pcntl_waitpid ($pid, $status, WNOHANG)

這樣子可以在沒(méi)有子進(jìn)程退出的情況下立刻返回,從而繼續(xù)執(zhí)行后續(xù)代碼。

以上則是我們的多進(jìn)程回聲服務(wù)程序。如果覺(jué)得文章還不錯(cuò)歡迎關(guān)注解鎖更多~

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/30873.html

相關(guān)文章

  • Java編程思想之多線程(一)

    摘要:多線程技術(shù)是個(gè)很龐大的課題,編程思想這本書英文版,以下簡(jiǎn)稱中也用了頁(yè)介紹的多線程體系。一個(gè)線程歸屬于唯一的進(jìn)程,線程無(wú)法脫離進(jìn)程而存在。五線程內(nèi)數(shù)據(jù)線程的私有數(shù)據(jù)僅歸屬于一個(gè)線程,不在線程之間共享,例如,,。 多線程技術(shù)是個(gè)很龐大的課題,《Java編程思想》這本書(英文版,以下簡(jiǎn)稱TIJ)中也用了136頁(yè)介紹Java的多線程體系。的確,Java語(yǔ)言發(fā)展到今天,多線程機(jī)制相比其他的語(yǔ)言從...

    taohonghui 評(píng)論0 收藏0
  • PHP回顧之多進(jìn)程編程

    摘要:多進(jìn)程中與多進(jìn)程相關(guān)的兩個(gè)重要拓展是和。函數(shù)執(zhí)行期間,主進(jìn)程除了等待無(wú)法處理其他任務(wù),所以一般不認(rèn)為這是多進(jìn)程編程?;厥兆舆M(jìn)程有兩種方式,一種是主進(jìn)程調(diào)用函數(shù)等待子進(jìn)程結(jié)束另外一種是處理信號(hào)。 轉(zhuǎn)載請(qǐng)注明文章出處: https://tlanyan.me/php-review... PHP回顧系列目錄 PHP基礎(chǔ) web請(qǐng)求 cookie web響應(yīng) session 數(shù)據(jù)庫(kù)操作 加解...

    lifesimple 評(píng)論0 收藏0
  • 基于Socket實(shí)現(xiàn)簡(jiǎn)單回聲務(wù)器

    摘要:上一篇文章是對(duì)編程的入門,這次我們基于實(shí)現(xiàn)一個(gè)簡(jiǎn)單的收發(fā)消息的服務(wù)。通過(guò)上面一篇文章,我們已經(jīng)對(duì)于創(chuàng)建套接字的流程有了一定的了解,在這里就不多說(shuō)這些了。第處將讀取到的輸入信息寫入緩沖區(qū),從而發(fā)送到服務(wù)端。 上一篇文章是對(duì)socket編程的入門,這次我們基于socket實(shí)現(xiàn)一個(gè)簡(jiǎn)單的收發(fā)消息的服務(wù)。 實(shí)現(xiàn)思路: 先說(shuō)服務(wù)端: 接受客戶端的連接 讀取客戶端發(fā)送過(guò)來(lái)的信息 將接受到信息發(fā)送...

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

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

0條評(píng)論

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