1. 程式人生 > >CGI/FastCgi/PHP-FPM

CGI/FastCgi/PHP-FPM

總是再配置虛擬主機的時候看到FastCgi和PHP-FPM,特意去搜了一下相關內容,當備忘錄記下

CGI的作用

CGI 是為了保證 web server 傳遞過來的資料是標準格式的,方便 CGI 程式的編寫者。
web server(比如說 Apache、Nginx、IIS、Lighttpd、Tomcat)只是內容的分發者。
Web Application 一般指PHP、Java、Asp.net等應用程式。

如果請求 /index.html,那麼 web server 會去檔案系統中找到這個檔案,傳送給瀏覽器,這裡分發的是靜態資料。
訪問靜態資料請求圖

如果現在請求的是 /index.php,根據配置檔案,nginx 知道這個不是靜態檔案,需要去找 PHP 解析器來處理,那麼他會把這個請求簡單處理後交給 PHP 解析器。Nginx 會傳哪些資料給 PHP 解析器呢?url、查詢字串、POST 資料、HTTP header 等等,CGI 就是規定要傳哪些資料、以什麼樣的格式傳遞給後方處理這個請求的協議。

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

FastCgi 是什麼

fastCgi 是用來提高 CGI 程式效能的。

那麼 CGI 程式的效能問題在哪呢?”PHP 解析器會解析 php.ini 檔案,初始化執行環境”,就是這裡了。標準的 CGI 對每個請求都會執行這些步驟,所以處理每個請求的時間會比較長。

那麼 fastCgi 是怎麼做的呢?首先,fastCgi 會先啟一個 master,解析配置檔案,初始化執行環境,然後再啟動多個 worker。當請求過來時,master 會傳遞給一個 worker,然後立即可以接受下一個請求。這樣就避免了重複的勞動,效率自然是高。而且當 worker 不夠用時,master 可以根據配置預先啟動幾個 worker 等著;當然空閒 worker 太多時,也會停掉一些,這樣就提高了效能,也節約了資源。這就是 fastCgi 對程序的管理。

PHP-FPM 是什麼

PHP-FPM 是一個實現了 FastCgi 的程式,被 PHP 官方收錄。

PHP 的直譯器是 php-cgi,它只是個 CGI 程式,只能解析請求,返回結果,不會程序管理。所以就出現了一些能夠排程 php-cgi 程序的程式,比如說由 lighthttpd 分離出來的 spawn-fcgi。PHP-FPM 也是這麼個東西,在長時間的發展後,逐漸得到了大家的認可,也越來越流行。

================================================================

CGI:是Web Server 與 Web Application 之間資料交換的一種協議,跟程序什麼的沒關係。
FastCGI:同 CGI,是一種通訊協議,但比 CGI 在效率上做了一些優化。同樣,SCGI 協議與 FastCGI 類似。
PHP-CGI:是 PHP (Web Application)對 Web Server 提供的 CGI協議的介面程式。
PHP-FPM:是 PHP(Web Application)對 Web Server 提供的 FastCGI 協議的介面程式,額外還提供了相對智慧一些任務管理。

FPM