1、Nginx + swoole
swoole是一個異步、并行、高性能的網絡通信引擎,使用純C語言編寫,提供了php語言的異步多線程服務器。swoole內置了http/websocket服務器端和客戶端,http2.0服務器端,支持類似Go語言的協程,可以使用同步代碼實現一步程序。
swoole采用I/O多路復用異步阻塞的Reactor模型,采用多線程Reactor+多線程Worker實現異步I/O。Reactor基于Epoll,每個Reactor可以處理無數個連接請求,因而可以輕松處理高并發。
Nginx+swoole模式下,nginx作為前端接入層轉發機,swoole作為應用服務器構建高并發web服務。
2、nginx + php-fpm
FastCGI是一個中立的技術標準,php-fpm是php語言的FastCGI進程管理器。
CGI的fork-and-execute模式有很多缺點,每接收一個請求就要fork一個進程處理,只能接收一個請求做出一個響應;每一個web請求PHP都必須重新解析php.ini文件,重新載入全部擴展并初始化全部數據結構。
FastCGI會事先啟動起來,解析php.ini文件,載入擴展,初始化數據結構都只會在啟動時完成,作為一個CGI管理服務器存在,使用進程/線程池預先啟動一系列的子進程來等待處理。然后web服務器發過來請求,一旦FastCGI接收到請求就交給子進程處理,不需要在接收到請求后啟動CGI,會快很多。Web服務器通過一個socket長連接請求FastCGI進程管理器。
FastCGI進程像是一個常駐CGI,在請求到達時,FastCGI進程管理器選擇并連接一個PHP-CGI解釋器去接收web服務器發送過來的環境變量和標準輸入,請求處理完成后將標準輸出或錯誤從同一連接返回給web服務器,該PHP-CGI解釋器子進程等待處理來自FastCGI進程管理器的下一個連接。
3、Apache + mod_php
mod_php模式運行php,意味著php是作為apache的一個模塊來啟動。只有在apache啟動的時候會讀取php.ini配置文件并加載擴展模塊,在apache運行期間是不會再去讀取和加載擴展模塊的。Apache出于穩定性和安全性考慮,通常使用默認的prefork模式運行php程序。在prefork模式下,一個單獨的控制進程負責產生子進程,這些子進程用于監聽請求并作出應答。
Apache總是試圖保持一些備用或空閑的子進程用于迎接即將到來的請求,這樣客戶端無需在得到服務前等候子進程的產生。但是,一旦連接數多了,apache必須要生成更多的進程來響應請求,CPU對于進程的切換就很頻繁,很耗事件和資源,導致apache性能下降;同時,apache在同步阻塞I/O模型下,select遍歷多個連接句柄才能知道句柄是否有事件通知,因此效率非常低。