php能支撐多少併發 PHP為什麼不能搞定大併發

2021-10-22 21:17:49 字數 1735 閱讀 8439

前言:

了解php的朋友都應該知道,效能一直是php被鄙視的地方,雖然php7.0以後,效能又上了乙個台階。但是還有很多只了解些皮毛就出來秀優越的朋友,說什麼php不支援多執行緒。搞定不了大併發。小打小鬧還行,大專案php勝任不了。今天我不談論語言之間的優勢劣勢,只說說php到底能不能搞定大併發

php-fpm生命週期

php-fpm生命週期

首先使用者請求到像apache或者nginx這樣的web service。如果是請求非靜態資料,比如動態頁面,或者是資料介面。就會通過fastcgi來將請求**到給php。這裡fastcig是一種協議,它會將nginx請求中獲得的資料處理成php能處理的格式,並且還會將資料放入php的全域性變數中,比如$_get,$_post。(這裡注意php模組不一定非要和nginx模組放在乙個伺服器上,nginx後面的php模組也不是只能有乙個)

那標題中提到的php-fpm是什麼東西?

php-fpm(fastcgi process manager) 從名字中可以看出,fpm是一款程序管理器。這個程式啟動之後就會有個master程序,這個程序會去初始化php.ini的配置資訊。然後master會啟動多個worker程序等待從nginx**的請求。當空閒時,master會銷毀一些worker程序,來節省資源。當work程序不夠用的時候,master會動態的啟動更多的work。可以說php-fpm不僅僅是用來在nginx 和 php之間通訊的fastcgi。同樣還是php的程序池管理工具。

當php通過fpm接收到來請求,除了php內部本身的**執行。可能還會有資料庫的互動,快取的互動,檔案的io。這裡的操作當然是根據php指令碼來控制的。當一切操作結束。php會將結果繼續通過fastcgi來返回給nginx。nginx 也會將處理好的資料返回給使用者。

通過上面的分析,其實我們知道了在nginx+php-fpm場景下php的單執行緒並不妨礙處理併發。當併發來了fpm會啟動更多的worker去處理。並沒有發生阻塞。

那為什麼php會被詬病,處理不了大併發呢?原因在php-fpm是乙個程序管理器。當乙個請求進來會占用乙個程序。十個請求進來就會占用十個程序。當遇到非常大的併發請求時,php會消耗掉cpu的所有程序數,導致服務不可用。同時建立程序,銷毀程序的開銷也比較大,效能上也造成了浪費

swoole生命週期

當然php不是以前的php了。他自己也在不停的進化,來適應更多的開發需要。swoole就是很好的例子。swoole是由中國人開發的php擴充套件。已經被php官方收錄。全世界的程式設計師都在使用。中國人為開源世界做貢獻,讓人挺感動的。

首先要說到的就是swoole的程序管理模式與php-fpm並沒有本質上的區別。同樣還是乙個master多個worker程序。但是不同的是乙個同步阻塞。乙個非同步非阻塞。

下面用一幅圖來對比下兩者的不同

php-fpm在執行**的時候遇到io(資料庫讀寫,快取讀寫,檔案讀寫)會同步阻塞。後面的任務必須等前面的任務執行完了之後才會接著執行。這種模式的效能是不如swoole的非同步執行的。同時因為效能不足還引發了乙個更重要的問題。當併發來的時候,程序數達到了最大限制,fpm就會進入等待。當乙個程序釋放之後才能繼續執行**。

而swoole因為單個程序執行速度更快,就能跟快的釋放掉,也就比fpm更不容易等待程序。這樣就能比fpm承載更大的qps

結語swoole官網壓力測試的結果

以上是官網做的壓力測試。在同一臺機器同樣的程序數的限制下,swoole的效能一騎絕塵。側面也反應出了,swoole+php的組合的確在效能上有了一次飛躍。相信未來也會有更多的開發會使用swoole來開發。後續我會更新幾篇關於swoole的使用篇。感謝閱讀~

PHP中變數為什麼要用

c vb php中 可以利用值 數和字串 的位置 1 函式引數 2 運算子運算元 包括vb中的賦值語句 3 陣列下標 包括phpkey標 能產生值 數和字串 的位置 1 簡單變數 2 陣列元素 3 結構成員 4 函式 5 常量 一般字面常量 c和php中define常量 vb中const常變數 6 ...

我們為什麼要學php

移動網際網路盛行的時代,市場會孕育新的產物,而每乙個人可以找能自己發展的方向。我們為什麼要學習php呢?一 php語言的優勢 1 跨平台特性 php幾乎支撐所有的操作體系平台,而且支撐apache iis等多種web伺服器。2 支撐普遍的資料庫 可操縱多種支流與非支流的資料庫。3 易學性 php嵌入...

為什麼說PHP 加 有危害

加與不加 結束?視情況而定。先定義一下兩者的區別。加的 之後的內容視為 純文字直接輸出 不加的 之後的內容視為 php 除非沒有 了。若是有其他 就會報錯 像一些函式庫,類庫這類檔案,不加結尾比較好。這樣當它們被其他檔案包含的時候,可以避免一些因為有輸出而導致的錯誤。比如 如果 test.php 有...