cgi、fast-cgi、php-cgi以及php-fpm之間的聯繫

之前就一直沒弄明白cgi、fast-cgi、php-cgi和php-fpm他們之間的聯繫,現在來梳理一下。

基本概念

  • cgi:全稱爲Common Gateway Interface(公共網關接口),保證了從瀏覽器傳遞到PHP程序的數據的標準格式。簡單來說就是規定了瀏覽器、前端服務器(比如nginx)以及PHP程序之間通信的數據格式,稱之爲通信接口協議。
  • fsat-cgi:對cgi協議的改進,使得通信更加高效。
  • php-cgi:php提供給web server也就是http前端服務器的cgi協議的接口程序。
  • php-fpm:php提供給web server也就是http前端服務器的fast-cgi協議的接口程序。這裏php-fpm扮演一個進程管理的角色,管理處理請求的進程。

在明白了這些概念之後我們就可以來討論他們之間的關係了。首先我們應該知道整個請求的流程。瀏覽器發送的請求不是直接到達php程序,而是先到達web server也就是前端服務器(以nginx爲例)由web server處理後才發送給php程序,但是php程序不認識web server發送的請求,而web server也不能識別php的相應代碼,所以就需要一個協議來轉換他們之間的數據,使得都能夠識別對方。這便是cgi協議的作用。

有了cgi、php-cgi爲什麼還要fast-cgi、php-fpm?

  • 在最開始是沒有fast-cgi協議的,使用fast-cgi協議是因爲cgi協議在每次連接請求時,會創建一個進程處理請求,去讀取php.ini裏的基礎配置信息,初始化執行環境返回數據之後退出進程。每當有一個新的請求連接都會重複此過程,因此有多少個連接就有多少個cgi進程,過多的進程消耗資源和內存增多,這也就是爲什麼傳統的cgi協議會顯得緩慢的原因。而fast-cgi協議則是一個進程可以處理多個請求,和上面的cgi協議完全不一樣。
  • php-cgi就是處理請求的進程,每當一個新的請求連接就會創建一個php-cgi進程並執行初始化操作,結束之後退出,顯然資源消耗高、效率低下。php-fpm則創建一個主進程(master)和多個工作進程(worker),由這個主進程去讀取php.ini裏的基礎配置信息,初始化執行環境。當有請求連接時主進程將配置信息發送給一個工作進程,由該工作進程來處理請求,這時如果又來一個請求,那麼主進程就配置另外一個工作進程,並由該工作進程來處理請求。我們可以看到,這樣就大大降低了內存與資源的消耗,提高效率。
  • 由上可知fast-cgi和php-fpm組合可以減少處理請求使得內存與資源的消耗,而php-fpm並沒有去處理請求,而是起到了一個進程管理的作用,他會管理工作進程(php-cgi)處理請求,而在請求完成後也不會停止工作進程,而是讓其等待下一個請求。另外,在php配置更新後也不需要重啓,php-fpm有平滑過渡配置更改功能,普通的php-cgi在每次更改配置後,需要重新啓動才能初始化新的配置,而php-fpm是不需要的,php-fpm會將新的連接發送給新的子程序php-cgi,這個時候加載的是新的配置,而原先正在運行的php-cgi還是使用的原先的配置,等到這個連接後下一次連接的時候會使用新的配置初始化。
發佈了61 篇原創文章 · 獲贊 67 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章