首頁 後端開發 php教程 PHPSocket程式設計中多進程的迴聲伺服器的詳細介紹(圖文)

PHPSocket程式設計中多進程的迴聲伺服器的詳細介紹(圖文)

Sep 13, 2018 pm 05:11 PM
linux php socket

這篇文章帶給大家的內容是關於PHPSocket程式設計中多進程的迴聲伺服器的詳細介紹(圖文) ,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

上次的迴聲服務程序有個很大的缺點,就是只能同時連接一個客戶端,這明顯是不合理的。

所以這次採用多進程的方式來實現同時為多個客戶端提供服務。

以下是最終的效果:

PHPSocket程式設計中多進程的迴聲伺服器的詳細介紹(圖文)

(透過ps 指令可以查看到我們建立的工作進程)

PHPSocket程式設計中多進程的迴聲伺服器的詳細介紹(圖文)

(透過xshell 開啟多個終端,並向服務程式連接多個客戶端)

在開始編碼之前,先介紹一下什麼是進程。

進程,即正在運行的佔用記憶體的程序,是一個獨立的記憶體空間。例如我們在 windows 上開啟記事本軟體,這個操作就等於開啟了一個行程。

而多進程則是透過建立多個進程來共同完成一件事。

我們這次只需實作服務端的程式就行了,客戶端還使用之前的。沒讀過之前文章的可以查看歷史文章。

在PHP中,我們可以使用 pcntl_fork 函數來實現建立進程。

下面是函數的原型:

int pcntl_fork ( void )
登入後複製

官方解釋:

成功時,在父行程執行緒內傳回產生的子程序的PID,在子程序執行緒內返回0。失敗時,在 父進程上下文傳回-1,不會建立子進程,並且會引發一個PHP錯誤。

為什麼說是父行程執行的執行緒呢,因為一個行程至少包含一個執行緒 ,而這個執行緒則是行程的主執行緒。

父進程在呼叫 pcntl_fork 時,同時複製出一個獨立的子進程,這個子進程具有父進程同樣的上下文。也就是說兩個行程共享一個程式碼而已。

下面進入編碼環節:

PHPSocket程式設計中多進程的迴聲伺服器的詳細介紹(圖文)

#透過執行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)

這樣子可以在沒有子進程退出的情況下立刻返回,從而繼續執行後續程式碼。

相關推薦:

伺服器端PHP多進程編程實戰

伺服器端PHP多進程程式設計實戰_PHP教程

以上是PHPSocket程式設計中多進程的迴聲伺服器的詳細介紹(圖文)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1653
14
CakePHP 教程
1413
52
Laravel 教程
1306
25
PHP教程
1251
29
C# 教程
1224
24
PHP和Python:解釋了不同的範例 PHP和Python:解釋了不同的範例 Apr 18, 2025 am 12:26 AM

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。

在PHP和Python之間進行選擇:指南 在PHP和Python之間進行選擇:指南 Apr 18, 2025 am 12:24 AM

PHP適合網頁開發和快速原型開發,Python適用於數據科學和機器學習。 1.PHP用於動態網頁開發,語法簡單,適合快速開發。 2.Python語法簡潔,適用於多領域,庫生態系統強大。

Linux體系結構:揭示5個基本組件 Linux體系結構:揭示5個基本組件 Apr 20, 2025 am 12:04 AM

Linux系統的五個基本組件是:1.內核,2.系統庫,3.系統實用程序,4.圖形用戶界面,5.應用程序。內核管理硬件資源,系統庫提供預編譯函數,系統實用程序用於系統管理,GUI提供可視化交互,應用程序利用這些組件實現功能。

PHP和Python:深入了解他們的歷史 PHP和Python:深入了解他們的歷史 Apr 18, 2025 am 12:25 AM

PHP起源於1994年,由RasmusLerdorf開發,最初用於跟踪網站訪問者,逐漸演變為服務器端腳本語言,廣泛應用於網頁開發。 Python由GuidovanRossum於1980年代末開發,1991年首次發布,強調代碼可讀性和簡潔性,適用於科學計算、數據分析等領域。

PHP的影響:網絡開發及以後 PHP的影響:網絡開發及以後 Apr 18, 2025 am 12:10 AM

PHPhassignificantlyimpactedwebdevelopmentandextendsbeyondit.1)ItpowersmajorplatformslikeWordPressandexcelsindatabaseinteractions.2)PHP'sadaptabilityallowsittoscaleforlargeapplicationsusingframeworkslikeLaravel.3)Beyondweb,PHPisusedincommand-linescrip

PHP與Python:用例和應用程序 PHP與Python:用例和應用程序 Apr 17, 2025 am 12:23 AM

PHP適用於Web開發和內容管理系統,Python適合數據科學、機器學習和自動化腳本。 1.PHP在構建快速、可擴展的網站和應用程序方面表現出色,常用於WordPress等CMS。 2.Python在數據科學和機器學習領域表現卓越,擁有豐富的庫如NumPy和TensorFlow。

繼續使用PHP:耐力的原因 繼續使用PHP:耐力的原因 Apr 19, 2025 am 12:23 AM

PHP仍然流行的原因是其易用性、靈活性和強大的生態系統。 1)易用性和簡單語法使其成為初學者的首選。 2)與web開發緊密結合,處理HTTP請求和數據庫交互出色。 3)龐大的生態系統提供了豐富的工具和庫。 4)活躍的社區和開源性質使其適應新需求和技術趨勢。

git怎麼查看倉庫地址 git怎麼查看倉庫地址 Apr 17, 2025 pm 01:54 PM

要查看 Git 倉庫地址,請執行以下步驟:1. 打開命令行並導航到倉庫目錄;2. 運行 "git remote -v" 命令;3. 查看輸出中的倉庫名稱及其相應的地址。

See all articles