摘要:所以這次采用多進程的方式來實現同時為多個客戶端提供服務。而多進程則是通過創建多個進程來共同完成一件事。如果是子進程的執行環境,則返回。正常情況下,子進程是通過父進程創建的。以上則是我們的多進程回聲服務程序。
上次的回聲服務程序有個很大的缺點,就是只能同時連接一個客戶端,這明顯是不合理的。
所以這次采用多進程的方式來實現同時為多個客戶端提供服務。
以下是最終的效果:
(通過 ps 命令可以查看到我們創建的工作進程)
(通過 xshell 打開多個終端,并向服務程序連接多個客戶端)
在開始編碼之前,先介紹一下什么是進程。
進程,即正在運行的占用內存的程序,是一個獨立的內存空間。比如我們在 windows 上打開記事本軟件,這個操作就相當于打開了一個進程。
而多進程則是通過創建多個進程來共同完成一件事。
我們本次只需實現服務端的程序就行了,客戶端還使用之前的。沒讀過之前文章的可以查看歷史文章。
在PHP中,我們可以使用 pcntl_fork 函數來實現創建進程。
下面是函數的原型:
int pcntl_fork ( void )
官方解釋:
成功時,在父進程執行線程內返回產生的子進程的PID,在子進程執行線程內返回0。失敗時,在 父進程上下文返回-1,不會創建子進程,并且會引發一個PHP錯誤。
為什么說是父進程執行的線程呢,因為一個進程中至少包含一個線程 ,而這個線程則是進程的主線程。
父進程在調用 pcntl_fork 時,同時復制出一個獨立的子進程,這個子進程具有父進程同樣的上下文。也就是說兩個進程共享一個代碼而已。
下面進入編碼環節:
通過執行 pcntl_fork 函數,同時復制了一個子進程,此時,如果上下文是父進程的執行環境,則返回值為子進程的進程號。如果是子進程的執行環境,則返回0。所以下面的if程序結構,兩個分支都執行了。
子進程同樣還是以前的邏輯,用來接收客戶端的消息,同時發送給客戶端。
倒數第二行調用了 pcntl_waitpid 函數,在講解這個函數之前我們先了解一下什么是僵尸進程。
正常情況下,子進程是通過父進程創建的。由于進程是互相獨立的內存結構,所以父進程是不會知道子進程的運行狀態的。子進程完成自己的任務之后,并不能自己退出,這個時候需要父進程通過操作系統來取得子進程的狀態,從而回收子進程。否則,我們的子進程將會成為一個垃圾資源,也就是僵尸進程。
下面是這個函數的函數原型:
int pcntl_waitpid ( int $pid , int &$status [, int $options = 0 ] )
官方解釋:
等待或返回fork的子進程狀態。
其實上面的代碼是有問題的,在 foreach 中第一次調用 pcntl_waitpid 之后 ,主進程其實此時是被阻塞著,一直在等待第一個子進程退出,而其他的子進程若此時異常退出,則并沒有被主進程回收,也就產生了僵尸進程。而在實際的開發中主進程還是要做其他的事情的。
所以這里推薦采用非阻塞的方式,很簡單,只需加上第三個參數:WNOHANG。即:pcntl_waitpid ($pid, $status, WNOHANG)
這樣子可以在沒有子進程退出的情況下立刻返回,從而繼續執行后續代碼。
以上則是我們的多進程回聲服務程序。如果覺得文章還不錯歡迎關注解鎖更多~
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/30873.html
摘要:多線程技術是個很龐大的課題,編程思想這本書英文版,以下簡稱中也用了頁介紹的多線程體系。一個線程歸屬于唯一的進程,線程無法脫離進程而存在。五線程內數據線程的私有數據僅歸屬于一個線程,不在線程之間共享,例如,,。 多線程技術是個很龐大的課題,《Java編程思想》這本書(英文版,以下簡稱TIJ)中也用了136頁介紹Java的多線程體系。的確,Java語言發展到今天,多線程機制相比其他的語言從...
摘要:多進程中與多進程相關的兩個重要拓展是和。函數執行期間,主進程除了等待無法處理其他任務,所以一般不認為這是多進程編程。回收子進程有兩種方式,一種是主進程調用函數等待子進程結束另外一種是處理信號。 轉載請注明文章出處: https://tlanyan.me/php-review... PHP回顧系列目錄 PHP基礎 web請求 cookie web響應 session 數據庫操作 加解...
摘要:上一篇文章是對編程的入門,這次我們基于實現一個簡單的收發消息的服務。通過上面一篇文章,我們已經對于創建套接字的流程有了一定的了解,在這里就不多說這些了。第處將讀取到的輸入信息寫入緩沖區,從而發送到服務端。 上一篇文章是對socket編程的入門,這次我們基于socket實現一個簡單的收發消息的服務。 實現思路: 先說服務端: 接受客戶端的連接 讀取客戶端發送過來的信息 將接受到信息發送...
閱讀 1849·2021-11-25 09:43
閱讀 1491·2021-09-02 15:21
閱讀 3453·2019-08-30 15:52
閱讀 1501·2019-08-30 12:48
閱讀 1295·2019-08-30 10:57
閱讀 2929·2019-08-26 17:41
閱讀 681·2019-08-26 11:59
閱讀 1366·2019-08-26 10:41