在PHP中,cgi是「Common Gateway Interface」的縮寫,是公共網關介面的意思,cgi可以讓一個客戶端從網頁瀏覽器向執行在網絡伺服器上的程序請求數據,是描述了伺服器和請求處理程序之間傳輸資料的一種標準。
本教學操作環境:windows10系統、PHP7.1版、DELL G3電腦
簡單來說CGI、 FastCGI只是一個協定而已, php-cgi 是實作cgi的程序, php-fpm是管理php-cgi的一個管理器而已。
CGI全名為「公共網關介面」(Common Gateway Interface),HTTP伺服器與你的或其它機器上的程式進行「交談」的一種工具,其程式必須運行在網路伺服器上。
是一種重要的網路技術,可以讓一個客戶端,從網頁瀏覽器向執行在網頁伺服器上的程式請求資料。
CGI 描述了伺服器和請求處理程序之間傳輸資料的一種標準。
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程式效能的。
FastCGI是從CGI發展改進而來的。傳統CGI介面方式的主要缺點是效能很差,因為每次HTTP伺服器遇到動態程式時都需要重新啟動腳本解析器來執行解析,然後結果會傳回給HTTP伺服器。
提高效能,那麼CGI 程式的效能問題在哪呢? "PHP解析器會解析php.ini文件,初始化執行環境",就是這裡了。標準的 CGI 對每個請求都會執行這些步驟(不閒累啊!啟動進程很累的說!),所以處理每個時間的時間會比較長。這明顯不合理嘛!那麼Fastcgi是怎麼做的呢?首先,Fastcgi會先啟動一個master,解析設定文件,初始化執行環境,然後再啟動多個worker。當請求過來時,master會傳遞給一個worker,然後立即可以接受下一個請求。這樣就避免了重複的勞動,效率自然是高。而當worker不夠用時,master可以根據配置預先啟動幾個worker等著;當然空閒worker太多時,也會停掉一些,這樣就提高了性能,也節約了資源。這就是fastcgi的對流程的管理。
那PHP-FPM又是什麼呢?是實現了Fastcgi 的程序,被PHP官方收了。
大家都知道,PHP的解釋器是php-cgi。 php-cgi只是個CGI 程序,他自己本身只能解析請求,返回結果,不會進程管理(皇上,臣妾真的做不到啊!)所以就出現了一些能夠調度php-cgi進程的程序,比如說由lighthttpd分離出來的spawn-fcgi。好了PHP-FPM也是這麼個東東,在長時間的發展後,逐漸得到了大家的認可,也越來越流行。
PHP-CGI是解釋PHP腳本的程式而已。
PHP-FPM是一個FastCGI 管理器
CGI 模式運作原理
當Nginx 收到瀏覽器/index.php 這個請求後,首先會建立對應實作了CGI 協定的進程,這裡就是php-cgi(PHP 解析器)。接下來 php-cgi 會解析 php.ini 文件,初始化執行環境,然後處理請求,再以 CGI 規定的格式傳回處理後的結果,退出進程。最後,Nginx 再把結果回傳給瀏覽器。整個流程就是一個 Fork-And-Execute 模式。當使用者請求數量非常多時,會大量擠佔系統的資源如記憶體、CPU時間等,造成效能低。所以在用 CGI 方式的伺服器下,有多少個連線請求就會有多少個 CGI 子進程,子進程反覆載入是 CGI 效能低下的主要原因。
推薦學習:《PHP影片教學》
以上是php中cgi是什麼意思的詳細內容。更多資訊請關注PHP中文網其他相關文章!