php cgi fastcgi 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 就是規定要傳哪些數據、以什麼樣的格式傳遞給後方處理這個請求的協議。

當 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 對進程的管理。


PHP-FPM 是什麼


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


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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章