|
導讀網頁的本質就是超級文本標記語言,通過結合使用其他的Web技術(如:腳本語言、公共網關接口、組件等),可以創造出功能強大的網頁。因而,超級文本標記語言是萬維網(Web)編程的基礎,也就是說萬維網是建立... 網頁的本質就是超級文本標記語言,通過結合使用其他的Web技術(如:腳本語言、公共網關接口、組件等),可以創造出功能強大的網頁。因而,超級文本標記語言是萬維網(Web)編程的基礎,也就是說萬維網是建立在超文本基礎之上的。超級文本標記語言之所以稱為超文本標記語言,是因為文本中包含了所謂“超級鏈接”點。 本篇文章給大家帶來的內容是關于PHPSocket編程中多進程的回聲服務器的詳細介紹(圖文) ,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。上次的回聲服務程序有個很大的缺點,就是只能同時連接一個客戶端,這明顯是不合理的。 所以這次采用多進程的方式來實現同時為多個客戶端提供服務。 以下是最終的效果:
(通過 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) 這樣子可以在沒有子進程退出的情況下立刻返回,從而繼續執行后續代碼。 相關推薦: 以上就是PHPSocket編程中多進程的回聲服務器的詳細介紹(圖文)的詳細內容,更多請關注php中文網其它相關文章! 網站建設是一個廣義的術語,涵蓋了許多不同的技能和學科中所使用的生產和維護的網站。 |
溫馨提示:喜歡本站的話,請收藏一下本站!