php這個名字實際上有兩層意思。
直接定義:
Php-fpm從php5.3.3開始進入Php源代碼包,之前是作為補丁存在的。
很少有人會去讀php本身的源代碼。六年前解決php內存泄露問題的時候做了壹些研究,最近又查了壹遍。我發現php的開發者很有誠意。這是壹個優秀的服務器軟件,有以下支持。
在linux服務器上,如果沒有設置events.mechanism,那麽默認情況下會采用epoll,所以
php-fpm的IO模型&並發處理能力與nginx完全壹致。
Nginx以其卓越的性能而聞名。大多數程序員認為php效率低下。看了源代碼,他們知道這是壹個傳說。
在高性能部署中,人們經常對nginx進行優化。之前自己部署php程序的時候犯了壹個錯誤。8G內存的服務器和php-fpm的max children都會設置為128+。現在看來太多了。請參考nginx的部署:
Php-fpm可以配置成3倍cpu核心數。
php-fpm的穩定性比nginx稍差。這是因為php-fpm有壹個內置的php解析器,php-fpm進程被綁定到php程序上。如果php腳本寫得不好,有壹個無限循環或者在遠程資源上被阻塞,它會拖累加載它的php-fpm進程。
nginx和後端應用服務器通過網絡的連接可以設置超時,不容易阻塞。
php-fpm的fastcgi是壹個短連接。我以為是長連接,看了代碼才知道是短連接。我在處理完壹個請求後關閉了它。
可惜php-fpm的接口采用fastcgi。php-fpm和fastcgi是完全綁定的,不能獨立使用。它只能部署在支持http-fcgi協議(nginx)的轉換器後面。其實可以考慮在php-fpm代碼包中引入http協議支持,讓php-fpm獨立運行,讓nodejs無話可說。
Php-fpm相當於OpenResty。OpenResty是中國人開發的nginx模塊,也就是在nginx中引入了lua解釋器。其實php-fpm和php-FPM唯壹的區別就是壹個使用php語法,壹個使用lua,所以OpenResty可以作為nginx的增強包,不需要選擇它作為主要的編程工具。
架構上,php-fpm已經做到最好了,超過了大多數python部署工具,我再也不會黑了。