php-cgi和php-fpm有什麼關係?

php-cgi是fastcgi 的進程管理器php-fpm 也是fastcgi的進程管理器

那麼php-fpm和php-cgi 有什麼關係呢。


php-cgi不是FastCGI進程管理器,php-fpm才是.

要對php-cgi進程進行管理,需要使用特別的模塊:

比如Apache的mod_fcgid,IIS的PHP Manager.

而Nginx只負責反向代理/請求轉發,不負責管理php-cgi進程,所以Nginx一般配合能夠自行管理工作進程(子進程)的php-fpm使用.

需要注意的是,php-fpm是一個獨立的SAPI,其管理的不是php-cgi,也就是說php-fpm跟php-cgi無關,php-fpm內置php解釋器,php-fpm的子進程是自己fork出來的,並不會調用php-cgi,你把系統中的php-cgi刪了也不會影響到php-fpm服務的正常運行.

php-fpm在pm = static配置下工作進程常駐後台,也就是如果你配置了5個工作進程pm.max_children = 5,那php-fpm服務啟動時就會自動fork出5個子進程並常駐後台,不會在請求處理結束後退出,也不會在空閑時退出.如果你在php腳本中使用了資料庫持久連接,這時這5個工作進程還會建立並維持5個到資料庫的持久連接,實現在處理多個請求的時候重用資料庫連接資源,避免每個請求都建立/釋放一次資料庫連接.持久連接還能做到超時自動重連,對php-fpm里的腳本來說是完全透明的,腳本只需在啟動時指明使用持久連接即可.

php-fpm在pm = dynamic配置下工作進程【部分】常駐後台,也就是維持一定數量的常駐進程,服務繁忙時fork出更多的進程,服務閑置時自動關掉一些進程,把內存資源歸還給操作系統.虛擬主機提供商應該是比較喜歡這種方式的.

總而言之,PHP-FPM這種運行模式類似於Apache的prefork MPM,能靜能動的多進程網路服務.


php54是之前是一種關係,php54之後另一種關係。

php54之前,php-fpm(第三方編譯)是管理器,php-cgi是解釋器

php54之後,php-fpm(官方自帶),master 與 pool 模式。php-fpm 和 php-cgi 沒有關係了。php-fpm又是解釋器,又是管理器

網上大部分說法:php-fpm 是管理php-cgi 的,是針對php54之前的


針對php-cgi 和 php-fpm , 我自己總結了一下。

cgi、fastcgi、php-cgi、php-fpm剖析


推薦閱讀:

項目做到什麼程度才可以進入Apache Incubator(Apache孵化器)?
如何看待2016年4月26日晚,中國互聯網被Struts2漏洞血洗?
怎樣正確做 Web 應用的壓力測試?
如何在生產伺服器上部署 Node.js 應用?
tomcat 與 nginx,apache的區別是什麼?

TAG:PHP | 伺服器 | Nginx | Apache | php-fpm |