I. php 多進程的使用情況如何? ? (絕大多數php程式都用上了 | 幾乎用不上)
II. php 多執行緒的使用情況如何? ? (絕大多數php程式都用上了 | 幾乎用不上)
III. php 多進程 , php多執行緒 相比較 java 怎麼樣? ? (簡直糟透了 | 不相上下)
網路上幾乎都寫到 php 不適合多線程(是否也不適合多進程??),是否這樣就不需要了解多線程,多進程之類的php相關特性了? ?
然後最近由於個人喜好,想自己動手做一個 類似qq的網頁版聊天工具,現在 基本上了解了 socket 通信 , 但 了解了下 workerman 這樣的開源 通信框架,他的特性介紹裡麵包括以下幾個:
I. php多重流程 可以發揮多核心cpu優勢,提高效能,並支援高並發? ?
II . php單一進程可以支援幾千甚至幾萬的並發連接,多進程則可以支援數十萬甚至上百萬的並發連接。 這句話該怎麼理解? ? 由於它採用的是socket 的方式進行通信,那麼端口數實際上是已經固定的,不會超過65536 ,一個端口表示一對連接,這邊說的幾千-》 幾萬可能還好一點, 多進程下的數十萬,上百萬,有那麼厲害嗎? ?
I. php 多進程的使用情況如何? ? (絕大多數php程式都用上了 | 幾乎用不上)
II. php 多執行緒的使用情況如何? ? (絕大多數php程式都用上了 | 幾乎用不上)
III. php 多進程 , php多執行緒 相比較 java 怎麼樣? ? (簡直糟透了 | 不相上下)
網路上幾乎都寫到 php 不適合多線程(是否也不適合多進程??),是否這樣就不需要了解多線程,多進程之類的php相關特性了? ?
然後最近由於個人喜好,想自己動手做一個 類似qq的網頁版聊天工具,現在 基本上了解了 socket 通信 , 但 了解了下 workerman 這樣的開源 通信框架,他的特性介紹裡麵包括以下幾個:
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進程:子進程,含解析器,解析腳本