面試經常被問到這個,於是查了一些資料整理下。
1.cgi全稱“通用網關接口”(Common Gateway Interface), 它可以讓一個客戶端,從瀏覽器向Web服務器上的程序請求數據,是客戶端和程序之間傳輸數據的一種標准,另外CGI獨立於任何語言,所以可以用任何一種語言編寫,只要這種語言具有標准輸入、輸出和環境變量。如php,perl,tcl等。CGI針對每個用戶請求都要開單獨的子進程去維護,執行結束處理掉這個進程。典型的fork-and-execute方式
2.fastcgi,根據1中cgi的特性,可以知道消耗很大,如果很多用戶請求,則會申請很多個子進程。。這時候出現了FastCGI。FastCGI 像是一個常駐 (long-live) 型的 CGI,它可以一直執行着,只要激活后,不會每次都要花費時間去 fork 一次 (這是 CGI 最為人詬病的 fork-and-execute 模式)。這個是當下用的最多的了。。linux+nginx+php+mysql
FastCGI的工作原理是:
(1)、Web Server啟動時載入FastCGI進程管理器【PHP的FastCGI進程管理器是PHP-FPM(php-FastCGI Process Manager)】(nginx);
(2)、FastCGI進程管理器自身初始化,啟動多個CGI解釋器進程 (在任務管理器中可見多個php-cgi.exe)並等待來自WebServer的連接。
(3)、當客戶端請求到達Web Server時,FastCGI進程管理器選擇並連接到一個CGI解釋器。Web server將CGI環境變量和標准輸入發送到FastCGI子進程php-cgi。
(4)、FastCGI子進程完成處理后將標准輸出和錯誤信息從同一連接返回Web Server。當FastCGI子進程關閉連接時,請求便告處理完成。FastCGI子進程接着等待並處理來自FastCGI進程管理器(運行在 WebServer中)的下一個連接。在正常的CGI模式中,php-cgi或 .exe在此便退出了。
在CGI模式中,你可以想象 CGI通常有多慢。每一個Web請求PHP都必須重新解析php.ini、重新載入全部dll擴展並重初始化全部數據結構。使用FastCGI,所有這些都只在進程啟動時發生一次。一個額外的好處是,持續數據庫連接(Persistent database connection)可以工作。
3.module形式一般用於apache,模塊模式是以mod_php5模塊的形式集成,此時mod_php5模塊的作用是接收Apache傳遞過來的PHP文件請求,並處理這些請求,然后將處理后的結果返回給Apache。
4.cli模式。命令行執行php,一般不用。我們在linux下經常使用 "php -m"查找PHP安裝了那些擴展就是PHP命令行運行模式;也可以直接命令行執行php xxx.php