11.30 php架構之CGI、FastCGI、php-fpm有什麼關係?原來這麼簡單

CGI、FastCGI、php-fpm


php架構之CGI、FastCGI、php-fpm有什麼關係?原來這麼簡單

lnmp

在使用PHP開發應用時,我們用的最多的無非就是LNMP、LAMP等架構,這也是PHP開發的經典架構,使用起來簡單好用,可正時因為簡單好用, 使得很多人僅僅停留在會使用的層次上;CGI、FastCGI、php-fpm這些名詞我們經常聽到,但是你真的知道它們在整個架構中處於什麼位置發揮什麼作用嗎?看完這篇文章,保證你如醍醐灌頂一般,清清楚楚。

php架構之CGI、FastCGI、php-fpm有什麼關係?原來這麼簡單

http/https


一:CGI是什麼?

CGI是一種協議,全稱公共網關接口(Common Gateway Interface),什麼是協議,就是一套標準,比如我們平時接觸最多的http/https。CGI專門用在webServer(nginx、apache)與CGI程序之間通信,CGI應用程序就是用編程語言編寫的應用程序,前提是這種語言具有標準輸入、輸出以及環境變量,比如php-cgi。

我們的webServer在收到用戶的.php類型的請求,就會把請求提交給cgi程序,這時php-cgi程序根據提交參數進行處理,然後按照標準輸出給webServer相應的html內容,服務器再返回給瀏覽器。整個過程中,CGI扮演了中間人的身份,完全獨立於服務器和應用程序(php-cgi)之外。

php架構之CGI、FastCGI、php-fpm有什麼關係?原來這麼簡單

網絡圖片

然而CGI有個很大的缺點,每一次的web請求都會退出進程,這也意味著每次請求都要重新開啟進程,造成系統資源的浪費,在高併發的場景中,顯然這不是最優的選擇,因此就出現了FastCGI。

二:FastCGI又是什麼?

FastCGI,從名字上看,應該是CGI的升級版,可以這麼理解吧;不同於CGI的是,FastCGI是一種數據交互的二進制協議,沒錯,它仍然是一種協議,它的目的在於降低webServer與應用程序(php-cgi)之間交互的負載,提高單位時間內請求的吞吐量。

FastCGI使用常駐進程的方式處理請求,這些常駐進程都由FastCGI Server統一管理,跟webServer沒有任何關係,請求過來時,webServer將環境變量和信息通過進程間通訊發送給FastCGI進程,處理完後返回給webServer,服務器再返回給瀏覽器。

php架構之CGI、FastCGI、php-fpm有什麼關係?原來這麼簡單

萬維網

FastCGI由於常駐進程,在請求量很小的時候仍然佔用內存,因此,相比CGI消耗更多的系統的內存。php官方發佈的php-cgi是自帶FastCGI管理器的,然而在使用過程中,一旦修改php.ini配置文件,就要kill掉php-cgi進程,重新啟動,不能熱重啟,所以又出現了php-fpm完美解決這個問題。

三:php-fpm厲害在哪?


php架構之CGI、FastCGI、php-fpm有什麼關係?原來這麼簡單

web server簡單請求過程

PHP-FPM全稱:PHP FastCGI Process Manager,是用於管理php-fastcgi進程的管理器,php-fpm會開啟一個master進程常駐,這個進程用來管理其他子進程work,而work進程則是按需開啟,如果在一定時間段裡沒有請求到work進程,work進程就會被關閉,而當請求數量增大時,則會開啟多個work進程來應付大量請求,work進程的最大數量不超過配置進程數。這樣對進程池形成了很好的管理。也完美解決了上述兩個問題。

php架構之CGI、FastCGI、php-fpm有什麼關係?原來這麼簡單

php架構

怎麼樣?是不是感覺其實也沒有想象中那麼難理解,理解了這些,以後在解決問題的過程中,就能多幾分把握問題關鍵點的幾率。語言本沒有好壞之分,架構則是一種思維體系,懂架構才能真正在技術的道路上越走越遠。

今天的分享就到這裡了,下期見!如果喜歡我的內容,關注我,下期更精彩~~

歡迎轉發、留言~~


分享到:


相關文章: