CGI、FastCGI、PHPFPM

CGI、FastCGI、PHPFPM

標籤(空格分隔): 未分類


CGI(通用網關接口 / Common Gateway Interface)
FastCGI(常駐型 CGI / Long-Live CGI)
PHPFPM (FastCGI 進程管理器(FPM))

CGI

  • 介紹

    CGI 即通用網關接口(Common Gateway Interface),它是一段程序,通俗的講 CGI 就象是一座橋,把網頁和 Web 服務器中的執行程序連接起來,它把 HTML 接收的指令傳遞給服務器的執行程序,再把服務器執行程序的結果返還給 HTML 頁。CGI 的跨平臺性能極佳,幾乎可以在任何操作系統上實現。

  • 執行流程

    用戶請求 —> web 服務器接收請求【常用 Nginx、apache】—> fork CGI 的子進程 & 處理請求 —-> 請求處理完畢,返回結果到 web 服務器 & 銷燬子進程 —> web 服務器返回結果給用戶

  • 優勢
    作爲 PHP 最早的運行模式,每次請求都獨立處理,調用過程足夠簡單清晰,可控性強
    進程間是隔離的,保證數據不會被污染

  • 劣勢

FastCGI

  • 介紹

    FastCGI 是 CGI 的升級版本,FastCGI 像是一個常駐 (long-live) 型的 CGI,在啓動 web 服務器的時候載入 FastCGI 進程管理器【PHP-FPM、IIS ISAPI、Apache Module】,當有請求過來的時候,web 服務器只需要交給 FastCGI 進程管理器處理即可。

  • 執行流程

    web 服務器啓動的時候 啓動 PHP-FPM master 進程(主要負責分配請求給空閒的自子進程處理)以及一定數量的 fast-cgi 子進程(負責處理請求)。 PHP-FPM master 進程管理一個進程池,池裏有若干個 fast-cgi 子進程,每個 fast-cgi 子進程單獨處理一個請求,互不干涉。

用戶請求 —> web 服務器接收請求【常用 Nginx、apache】—> 檢測到是 PHP 請求 & 轉發給 FPM master 進程 —> FPM master 進程 指定空閒 fast-cgi 子進程處理請求 —> 子進程載入文件(如 php.ini)及其他資源處理請求 —> 處理結束 & 清除資源,結果返回 master & 子進程掛起,標記爲空閒 —> master 將結果返回 web 服務器 —> web 服務器返回結果給用戶

  • 優勢

    從穩定性上看,FastCGI 是以獨立的進程池來運行 CGI,單獨一個進程死掉,系統可以很輕易的丟棄,然後重新分配新的進程來運行邏輯
    從安全性上看,FastCGI 和宿主的 web Server 完全獨立,FastCGI 不會影響 web 服務器的運行【如果 PHP-FPM 處於關閉狀態,則會返回 502 bad gateway 給用戶】
    從性能上看,FastCGI 把動態邏輯的處理從 web Server 中分離出來,大負荷的 IO 處理還是留給宿主 Server,這樣宿主 Server 可以一心一意作 IO【對於一個普通的動態網頁來說,邏輯處理可能只有一小部分,更多的是圖片等靜態資源的加載】

  • 劣勢

    一個 fast-cgi 子進程同一時間只能處理一個請求,所以網站的併發性能就受限於子進程數量
    如果開啓的進程過多,會導致 CPU 將大量的時間浪費在進程的上下文切換上。
    每次請求 fast-cgi 子進程都需要重新加載相關資源,請求結束需要釋放資源

PHPFPM

  • 簡介
    FPM(FastCGI 進程管理器)用於替換 PHP FastCGI 的大部分附加功能,對於高負載網站是非常有用的

  • 執行流程
    PHP-FPM 負責管理一個進程池來處理來自 Web 服務器的 HTTP 動態請求,在 PHP-FPM 中,master 進程負責與 Web 服務器進行通信,接收 HTTP 請求,再將請求轉發給 worker 進程進行處理,worker 進程主要負責動態執行 PHP 代碼,處理完成後,將處理結果返回給 Web 服務器,再由 Web 服務器將結果發送給客戶端。這就是 PHP-FPM 的基本工作原理

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