PHP 程式碼是如何執行的,PHP常見的執行模式主要有以下幾種
CLI
CLI(Command Line Interface,命令列介面)模式指的就是在命令列執行 PHP 指令碼,一般用來寫獨立執行的指令碼程式或者需要常駐記憶體的服務。
Apache Module
Module 模式使用 mod_php 在 web 伺服器上執行 PHP 指令碼程式碼。當使用 mod_php 時,PHP 直譯器將會嵌入到 Apache fork 的每個程式中,這樣每個 Apache work 程式都可以處理 PHP 指令碼程式,而不用依賴任何外部程式。也可以理解為 Apache Module 把 PHP 指令碼當做 Apache 服務擴充套件的一部分與 Apache 繫結一起使用。
缺陷:
由於 PHP 直譯器嵌入每個 Apache work 程式中,即使是處理靜態資源(靜態檔案或圖片)時,程式中依然包含 PHP 直譯器。
PHP 程式碼執行與 web 伺服器耦合在一起,對安全和擴充套件不友好。
優勢:
PHP 直譯器跟隨 Apache 一起啟動,不用每次執行 PHP 指令碼都需要 fork 程式和載入資源,速度較快。
CGI
CGI(Common Gateway Interface,通用閘道器介面)是 web 伺服器與應用程式之間的通訊協議,用於 web 伺服器(Nginx、Apache)與應用程式(PHP、Java)之間資料的傳輸。使用 CGI 模式的執行,當 web 服務在遇到 PHP 指令碼的時候會將 PHP 程式提交給實現了 CGI 協議的應用程式(php-cgi.exe)解釋,並將解釋後的結果返回給 web 伺服器。CGI 的應用主要在網站早期,由於其效能的缺陷現在已經很少使用了。
缺陷:
每有一個使用者請求,都要先建立 CGI 的子程式,然後處理請求,處理完之後再結束該子程式,這就是 Fork-And-Execute 模式。當使用者數量大時,就會建立大量的子程式,從而造成資源的浪費。而且每次 Fork 子程式時都需要載入 PHP 配置資訊和初始化程式,反覆執行重複的操作,這也是 CGI 效能低下的主要原因之一。
優勢:
相比於 Apache Module 模式,CGI 將應用從 web 伺服器中分離出來單獨執行,而 Apache Module 模式將PHP作為 web 伺服器的模組執行。這樣程式的安全性、擴充套件性和程式碼結構的清晰性都有了很大提高。
FastCGI
FastCGI 模式是 CGI 模式的升級版。它結合了 Apache Module 模式和 CGI 模式的優勢,也是現在使用最廣泛的 PHP 執行模式。FastCGI 是一個常駐(long-live)型的 CGI,服務傳入請求時,網路伺服器通過Unix域套接字、命名管道或傳輸控制協議(TCP)連線向 FastCGI 程式傳送環境變數資訊和頁面請求。響應通過相同的連線從程式返回到網路伺服器,然後網路伺服器將該響應傳遞給終端使用者。連線可能在響應結束時關閉,但是web伺服器和FastCGI服務程式都將持續,不會被銷燬。每個單獨的 FastCGI 程式在其生命週期內可以處理許多請求,從而避免了每個請求程式建立和終止的開銷。php-fpm 就是 FastCGI 的實現。
本作品採用《CC 協議》,轉載必須註明作者和本文連結