cgi,fastcgi,php-fpm

weixin_34337265發表於2016-11-22

CGI

簡介:

CGI全稱是“通用閘道器介面”(Common Gateway Interface),它可以讓一個客戶端,從網頁瀏覽器向執行在Web伺服器上的程式請求資料。 CGI描述了客戶端和這個程式之間傳輸資料的一種標準/協議。

CGI的一個目的是要獨立於任何語言的,所以CGI可以用任何一種語言編寫,只要這種語言具有標準輸入、輸出和環境變數。 如php,perl,tcl等。

原理:

  • 客戶端訪問某個 URL 地址之後,通過 GET/POST/PUT 等方式提交資料,並通過 HTTP 協議向 Web 伺服器發出請求。
  • 伺服器端的 HTTP Daemon(守護程式)啟動一個子程式。然後在子程式中,將 HTTP 請求裡描述的資訊通過標準輸入 stdin 和環境變數傳遞給 URL 指定的 CGI 程式,並啟動此應用程式進行處理,處理結果通過標準輸出 stdout 返回給 HTTP Daemon 子程式。
  • 再由 HTTP Daemon 子程式通過 HTTP 協議返回給客戶端。

缺點:

效率低下:每一個連線 fork 一個程式處理。
功能十分有限:CGI只能收到一個請求,輸出一個響應。很難在CGI體系去對Web請求的控制,例如:使用者認證等。

FastCGI

簡介

FastCGI像是一個常駐(long-live)型的CGI,它可以一直執行著,只要啟用後,不會每次都要花費時間去fork一次(這是CGI最為人詬病的fork-and-execute 模式)。它還支援分散式的運算, 即 FastCGI 程式可以在網站伺服器以外的主機上執行並且接受來自其它網站伺服器來的請求。

FastCGI是語言無關的、可伸縮架構的CGI開放擴充套件,其主要行為是將CGI直譯器程式保持在記憶體中並因此獲得較高的效能。眾所周知,CGI直譯器的反覆載入是CGI效能低下的主要原因,如果CGI直譯器保持在記憶體中並接受FastCGI程式管理器排程,則可以提供良好的效能、伸縮性、Fail- Over特性等等。

原理

  • 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-CGI

簡介

php的fastcgi實現,同時也作為php的指令碼解析器負責執行php指令碼。

缺點是程式管理排程比較差。

PHP-FPM

簡介

PHP-FPM(FastCGI流程管理器)是一種替代的PHP FastCGI實現。

對於PHP 5.3.3之前的php來說,是一個補丁包 ,旨在將FastCGI程式管理整合進PHP包中。PHP5.3.3已經整合php-fpm了,不再是第三方的包了。

相對Spawn-FCGI,PHP-FPM在CPU和記憶體方面的控制都更勝一籌,而且前者很容易崩潰,必須用crontab進行監控,而PHP-FPM則沒有這種煩惱。

安裝時在./configure的時候帶 –enable-fpm引數即可開啟PHP-FPM。

作用

有效控制記憶體和程式
自動子程式建立
基本統計
程式優雅停止/啟動
能夠啟動具有不同uid / gid / chroot /環境和不同php.ini的worker
Stdout和stderr日誌記錄
在意外操作碼快取損壞的情況下緊急重啟
加速上傳支援
支援“slowlog”
FastCGI的增強功能,如fastcgi_finish_request()

相關文章