CGI和FastCGI

秋夜雨巷發表於2024-09-26

CGI

通用閘道器介面CGI(Common Gateway Interface)和快速通用閘道器介面FastCGI(Fast Common Gateway Interface/FastCGI)都是是介面規範。是伺服器與外部程式(如指令碼或應用)之間通訊的一種方式,最早被設計用於執行各種伺服器端指令碼。是伺服器與外部可執行程式進行互動的橋樑。

CGI(Common Gateway Interface)

CGI 是早期的標準介面,用於 Web 伺服器和外部程式之間進行通訊,外部程式可以用任何程式語言編寫,只要該語言能夠輸出標準的文字格式(如 HTML)。一些常用語言中的 CGI 實現包括:
•Perl:最早的 CGI 程式大多是用 Perl 編寫的,Perl 的強大文字處理能力讓它非常適合處理 Web 請求。
•Python:Python 也有自己的 CGI 模組,允許開發者編寫 CGI 指令碼來處理 Web 請求。
•Ruby:Ruby 也可以透過 CGI 實現簡單的 Web 應用。
•C/C++:由於 CGI 程式本質上是一個外部可執行程式,用 C 或 C++ 編寫 CGI 程式也是可以的,儘管開發相對複雜。

FastCGI

FastCGI 是 CGI 的改進版本,最佳化了效能,同樣也可以在多種語言中使用。它的工作原理是透過保持外部程式的長時間執行來避免頻繁建立和銷燬程序,因此提高了效率。不同語言對 FastCGI 的支援情況:
•PHP:FastCGI 最常見的用例之一是與 PHP-FPM(PHP FastCGI Process Manager)一起使用,提升 PHP 在高併發環境中的效能。
•Python:Python 透過 Web 框架(如 Flask、Django)和 flup 等 FastCGI 實現,支援 FastCGI 協議。
•Ruby:Ruby on Rails 可以透過 Phusion Passenger 或其他 FastCGI 實現來支援高效的 Web 請求處理。
•Java:雖然 Java 本身一般透過 Servlet 來處理 Web 請求,但也可以透過 FastCGI 來與 Web 伺服器通訊。
•Go:Go 語言可以透過第三方庫與 FastCGI 整合,用於處理 Web 請求。
•Node.js:雖然 Node.js 主要採用事件驅動的非阻塞 I/O 模式,但也可以透過 FastCGI 與傳統 Web 伺服器(如 Nginx)進行通訊。
•C/C++:如果用 C/C++ 編寫的 Web 應用需要高效能,FastCGI 也可以作為一種替代方案來提升效率。

總結

CGI和FastCGI的區別與使用執行緒池原理類似,避免重複建立和銷燬造成的資源浪費

PHP中的應用

CGI(Common Gateway Interface)

CGI 是一種標準協議,用於伺服器與外部程式(例如 PHP)進行通訊。當一個 CGI 請求發出時,伺服器會啟動一個新的程序來處理該請求。這種方式有以下特點:
•每個請求都會生成一個新的程序:這意味著對於每個請求,伺服器都會啟動一個新的 PHP 直譯器程序,這個程序在請求處理結束後會被銷燬。
•效能問題:因為每次請求都要啟動和銷燬程序,CGI 的效能在併發請求高的情況下非常低,效率較差。
•適合小規模專案:由於 CGI 的處理方式較為簡單,適合小規模的應用或者開發除錯階段。
在使用 ThinkPHP 時,如果伺服器配置了 CGI,PHP 指令碼會透過 CGI 執行,但這種方式不適合高併發的環境

FastCGI(Fast Common Gateway Interface/FastCGI)

FastCGI 是對 CGI 的改進協議,旨在提高效能。它的工作原理是:
•程序複用:FastCGI 啟動後,會保持一組 PHP 程序在記憶體中,不需要為每個請求重新啟動 PHP 直譯器程序。多個請求可以複用這些程序,這大大提高了效能。
•持久連線:FastCGI 透過持久化程序,減少了建立和銷燬程序的開銷,適合處理高併發請求。
•支援併發處理:FastCGI 可以同時處理多個請求,這使得它在大型專案中廣泛應用。

在 ThinkPHP 專案中,如果使用 FastCGI,那麼 PHP 指令碼的執行效率會大大提升,特別是在高併發或大型專案中

ThinkPHP 中的 CGI 和 FastCGI 使用

在實際部署 ThinkPHP 專案時,通常使用 FastCGI 來提高效能。FastCGI 通常與 Nginx、Apache 結合,透過 PHP-FPM(PHP FastCGI Process Manager)來管理 PHP 程序,從而提升伺服器的併發處理能力。

總結

•CGI:每次請求都啟動一個新的 PHP 程序,適合小規模專案或開發階段,但效能較差。
•FastCGI:程序複用,適合高併發和大型專案,效能優越,常與 PHP-FPM 結合使用。

相關文章