首頁  >  文章  >  後端開發  >  socket - 使用php多執行緒 , 多進程? ?

socket - 使用php多執行緒 , 多進程? ?

WBOY
WBOY原創
2016-09-21 14:13:141363瀏覽

I. php 多進程的使用情況如何? ? (絕大多數php程式都用上了 | 幾乎用不上)

II. php 多執行緒的使用情況如何? ? (絕大多數php程式都用上了 | 幾乎用不上)

III. php 多進程 , php多執行緒 相比較 java 怎麼樣? ? (簡直糟透了 | 不相上下)

網路上幾乎都寫到 php 不適合多線程(是否也不適合多進程??),是否這樣就不需要了解多線程,多進程之類的php相關特性了? ?

然後最近由於個人喜好,想自己動手做一個 類似qq的網頁版聊天工具,現在 基本上了解了 socket 通信 , 但 了解了下 workerman 這樣的開源 通信框架,他的特性介紹裡麵包括以下幾個:

socket - 使用php多執行緒 , 多進程? ?

socket - 使用php多執行緒 , 多進程? ?

socket - 使用php多執行緒 , 多進程? ?

I. php多重流程 可以發揮多核心cpu優勢,提高效能,並支援高並發? ?

II . php單一進程可以支援幾千甚至幾萬的並發連接,多進程則可以支援數十萬甚至上百萬的並發連接。 這句話該怎麼理解? ? 由於它採用的是socket 的方式進行通信,那麼端口數實際上是已經固定的,不會超過65536 ,一個端口表示一對連接,這邊說的幾千-》 幾萬可能還好一點, 多進程下的數十萬,上百萬,有那麼厲害嗎? ?

回覆內容:

I. php 多進程的使用情況如何? ? (絕大多數php程式都用上了 | 幾乎用不上)

II. php 多執行緒的使用情況如何? ? (絕大多數php程式都用上了 | 幾乎用不上)

III. php 多進程 , php多執行緒 相比較 java 怎麼樣? ? (簡直糟透了 | 不相上下)

網路上幾乎都寫到 php 不適合多線程(是否也不適合多進程??),是否這樣就不需要了解多線程,多進程之類的php相關特性了? ?

然後最近由於個人喜好,想自己動手做一個 類似qq的網頁版聊天工具,現在 基本上了解了 socket 通信 , 但 了解了下 workerman 這樣的開源 通信框架,他的特性介紹裡麵包括以下幾個:

socket - 使用php多執行緒 , 多進程? ?

socket - 使用php多執行緒 , 多進程? ?

socket - 使用php多執行緒 , 多進程? ?

I. php多重流程 可以發揮多核心cpu優勢,提高效能,並支援高並發? ?

II . php單一進程可以支援數千甚至幾萬的並發連接,多進程則可以支援數十萬甚至上百萬的並發連接。 這句話該怎麼理解? ? 由於它採用的是socket 的方式進行通信,那麼端口數實際上是已經固定的,不會超過65536 ,一個端口表示一對連接,這邊說的幾千-》 幾萬可能還好一點, 多進程下的數十萬,上百萬,有那麼厲害嗎? ?

修正一個概念:連接埠總數是一個unsigned short,即65535。這不代表一個伺服器只能支撐這麼多連線!一個連接埠對應一個進程,一個進程的連接數更這個進程打開的socket描述符的數量是一致的。而描述符的數量是32位元int數量級,當然系統有最多行程描述符的限制,可以透過核心參數來配置,但上個幾十萬肯定沒問題的。

一個典型的多進程http伺服器的工作原理大概是這樣的:一個進程負責監聽80端口的連接,當連接到來後,對應的描述符被內核創建出來,然後進程找一個相對空閒的子進程來處理這個描述符,即在這個描述符上讀寫資料。注意這裡是子進程,正是因為子進程,才可以在父子進程間傳遞描述符。如果訪問量上來了,子進程的數量不夠了,父進程可以酌情創建新的子進程來處理描述符;父進程在一定程度上應實現簡單的負載平衡策略。

基於多執行緒的http伺服器運作原理其實差不多,把上面的行程改成執行緒一樣可以解釋。

以上闡述跟php沒有關係,php只不過是在這些底層的概念和系統呼叫上封裝了而已。大多數人使用php是基於php的腳本解釋器。而workerman應該是基於php封裝的系統呼叫實現的http服務。

  • php行程是由php-fpm(fastcgi的實作)管理:master行程會把請求分送到子行程

    • master進程:服務與web server通訊

      • 通訊實作方式一:http socket(主機+埠),會佔用一個端口,所以也就是說這裡php-fpm只佔用一個埠

      • 通訊實作方式二:unix domain socket(進程間通訊),是基於.sock檔案的方式,不依賴網路協議,所以也就是說理論上不佔用埠

    • pool進程:子進程,含解析器,解析腳本

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