cgi即通用閘道器介面(common gatewag inte***ce),它是一段程式,通俗的講cgi就象是一座橋,把網頁和web伺服器中的執行程式連線起來,它把html接收的指令傳遞給伺服器的執 行程式,再把伺服器執行程式的結果返還給html頁。cgi 的跨平台效能極佳,幾乎可以在任何作業系統上實現。
cgi方式在遇到連線請求(使用者 請求)先要建立cgi的子程序,啟用乙個cgi程序,然後處理請求,處理完後結束這個子程序。這就是fork-and-execute模式。所以用cgi 方式的伺服器有多少連線請求就會有多少cgi子程序,子程序反覆載入是cgi效能低下的主要原因。都會當使用者請求數量非常多時,會大量擠占系統的資源如內 存,cpu時間等,造成效能低下。
fast-cgi 是cgi的公升級版本,fastcgi像是乙個常駐(long-live)型的cgi,它可以一直執行著,只要啟用後,不會每次都要花費時間去fork一 次。php使用php-fpm(fastcgi process manager),全稱php fastcgi程序管理器進行管理。
web server啟動時載入fastcgi程序管理器(iis isapi或apache module)。fastcgi程序管理器自身初始化,啟動多個cgi直譯器程序(可見多個php-cgi)並等待來自web server的連線。
當客戶端請求到達web server時,fastcgi程序管理器選擇並連線到乙個cgi直譯器。web server將cgi環境變數和標準輸入傳送到fastcgi子程序php-cgi。
fastcgi子程序完成處理後將標準輸出和錯誤資訊從同一連線返回web server。當fastcgi子程序關閉連線時,請求便告處理完成。fastcgi子程序接著等待並處理來自fastcgi程序管理器(執行在web server中)的下乙個連線。 在cgi模式中,php-cgi在此便退出了。
在上述情況中,你可以想象cgi通常有多慢。每乙個web 請求php都必須重新解析php.ini、重新載入全部擴充套件並重初始化全部資料結構。使用fastcgi,所有這些都只在程序啟動時發生一次。乙個額外的 好處是,持續資料庫連線(persistent database connection)可以工作。
php作為apache模組,apache伺服器在系統啟動後,預先生成多個程序副本駐留在記憶體中,一旦有請求出 現,就立即使用這些空餘的子程序進行處理,這樣就不存在生成子程序造成的延遲了。這些伺服器副本在處理完一次http請求之後並不立即退出,而是停留在計算機中等待下次請求。對於客戶瀏覽器的請求反應更快,效能較高。
結構體:
struct _sapi_module_struct
呼叫api:模組啟動時呼叫:
int (*startup)(struct _sapi_module_struct *sapi_module);
模組結束時呼叫:
int (*shutdown)(struct _sapi_module_struct *sapi_module);
處理request時呼叫:
int (*activate)(void);
處理完request呼叫:
int (*activate)(void);
結構體:
cli生命週期:
結構體:
fpm模式的生命週期:
PHP7核心學習筆記 請求的生命週期
php的整個生命週期可以大致分為五個步驟 其中step1和step5不是每種模式下都要重複執行的。在cli模式下,指令碼執行會完整經歷5個步驟。而在fast cgi模式下,step1只在啟動時執行,每個請求處理時只經歷step2 step3 step4,在最終sapi關閉時會經歷step5。step...
PHP生命週期
2015 08 19 15 05 30 週三 一篇很好的文章 php核心探索 總結一下 1.模組初始化 minit 各個php模組 擴充套件初始化內部變數,告訴php呼叫自己的函式時,函式體在 到php那裡去註冊自己的函式 2.請求初始化 rinit 初始化session,全域性變數.等只針對當前請...
PHP生命週期
2015 08 19 15 05 30 週三 一篇很好的文章 php核心探索 總結一下 1.模組初始化 minit 各個php模組 擴充套件初始化內部變數,告訴php呼叫自己的函式時,函式體在 到php那裡去註冊自己的函式 2.請求初始化 rinit 初始化session,全域性變數.等只針對當前請...