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

來源:互聯網
上載者:User
這篇文章介紹的內容是關於cgi、fastcgi、php-cgi、php-fpm剖析,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

定義


首先,CGI是幹嘛的?CGI是為了保證web server傳遞過來的資料是標準格式的,方便CGI程式的編寫者。

web server(比如說nginx)只是內容的分發者。比如,如果請求/index.html,那麼web server會去檔案系統中找到這個檔案,發送給瀏覽器,這裡分發的是待用資料。好了,如果現在請求的是/index.php,根據設定檔,nginx知道這個不是靜態檔案,需要去找PHP解析器來處理,那麼他會把這個請求簡單處理後交給PHP解析器。Nginx會傳哪些資料給PHP解析器呢?url要有吧,查詢字串也得有吧,POST資料也要有,HTTP header不能少吧,好的,CGI就是規定要傳哪些資料、以什麼樣的格式傳遞給後方處理這個請求的協議。仔細想想,你在PHP代碼中使用的使用者從哪裡來的。

當web server收到/index.php這個請求後,會啟動對應的CGI程式,這裡就是PHP的解析器。接下來PHP解析器會解析php.ini檔案,初始化執行環境,然後處理請求,再以規定CGI規定的格式返回處理後的結果,退出進程。web server再把結果返回給瀏覽器。

好了,CGI是個協議,跟進程什麼的沒關係。那fastcgi又是什麼呢?Fastcgi是用來提高CGI程式效能的。

提高效能,那麼CGI程式的效能問題在哪呢?"PHP解析器會解析php.ini檔案,初始化執行環境",就是這裡了。標準的CGI對每個請求都會執行這些步驟(不閑累啊!啟動進程很累的說!),所以處理每個時間的時間會比較長。這明顯不合理嘛!那麼Fastcgi是怎麼做的呢?首先,Fastcgi會先啟一個master,解析設定檔,初始化執行環境,然後再啟動多個worker。當請求過來時,master會傳遞給一個worker,然後立即可以接受下一個請求。這樣就避免了重複的勞動,效率自然是高。而且當worker不夠用時,master可以根據配置預先啟動幾個worker等著;當然空閑worker太多時,也會停掉一些,這樣就提高了效能,也節約了資源。這就是fastcgi的對進程的管理。


cgi

  • 通用閘道介面,外部程式與web伺服器之間的介面標準,是在cgi程式和web伺服器之間傳遞資訊的過程

  • 每一次請求都會產生一個cgi進程,cgi程式執行完,進程退出

  • 獨立於伺服器、獨立程式設計語言

FastCgi

  • FastCgi 像是一個常駐型的Cgi,它可以一直執行這,只要啟用後,不需要每次去fork一次,還支援分布式運算,即FastCgi程式可以在網站伺服器以外的主機上執行並且接受來自其他網站伺服器的請求

  • 可以同時處理多個請求

  • 長期佔用記憶體

php-cgi

  • php官方內建的FastCGI 進程管理器

  • php.ini修改之後,必須kill掉php-cgi再啟動php.ini 才生效。不可以平滑的重啟

  • 記憶體不能動態分配

php-fpm

  • 非官方fastCgi進程管理器,後來php5.4開始,被官方收錄了,編譯php的時候只需要–enable-fpm 就可以開啟php-fpm

  • 可以平滑重啟php

  • 動態調度進程




Nginx只負責反向 Proxy/請求轉寄,不負責管理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,能靜能動的多進程網路服務.




php-cgi是早期php官方出品的fastcgi管理器,不支援平滑重啟,改了php.ini就要kill掉原來的php-cgi再重新啟動才會生效;不支援動態worker調度,只能一開始指定要起幾個worker。

php-fpm是從5.3.3才加入的fastcgi進程管理器,加入了動態調度功能,可以根據請求來訪壓力變化動態增減worker進程數量;支援reload指令,讓worker進程在完成當前請求後重啟,並應用php.ini新配置。





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


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

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


參考網站https://www.zhihu.com/question/55835080

https://segmentfault.com/q/1010000000256516

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.