掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
這里所說的 php 運行模式, 其實指的是 SAPI (server Application Programming Interface,服務(wù)端應(yīng)用編程端口 )。SAPI 為 PHP 提供了一個和外部通信的接口, PHP 就是通過這個接口來與其它的應(yīng)用進行數(shù)據(jù)交互的。針對不同的應(yīng)用場景, PHP 也提供了多種不同的 SAPI ,常見的有:apache、apache2filter、apache2handler、cli、cgi、embed 、fast-cgi、isapi 等等。

創(chuàng)新互聯(lián)長期為上1000家客戶提供的網(wǎng)站建設(shè)服務(wù),團隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為澄江企業(yè)提供專業(yè)的網(wǎng)站制作、成都網(wǎng)站制作,澄江網(wǎng)站改版等技術(shù)服務(wù)。擁有10年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。
目前 PHP 內(nèi)置的很多 SAPI 實現(xiàn)都已不再維護或者變的有些非主流了,PHP 社區(qū)目前正在考慮將一些 SAPI 移出代碼庫。 社區(qū)對很多功能的考慮是除非真的非常必要,或者某些功能已近非常通用了,否則就在 PECL 庫中。
接下來會對其中五個比較常見的運行模式進行說明。
CLI( Command Line Interface ), 也就是命令行接口,PHP 默認會安裝。通過這個接口,可以在 shell 環(huán)境下與 PHP 進行交互 。在終端里輸入 php -v,會得到類似下圖的結(jié)果(安裝了 PHP 前提下):
因為有 CLI 的存在,我們可以直接在終端命令行里運行 PHP 腳本,就像使用 shell、Python 那樣,不用依賴于 WEB 服務(wù)器。比如 Laravel 框架中的 Artisan 命令行工具,它其實就是一個 PHP 腳本,用來幫助我們快速構(gòu)建 Laravel 應(yīng)用的。
WEB 服務(wù)器只是內(nèi)容的分發(fā)者。比如 Nginx,如果客戶端請求了 /index.html,那么 Nginx 會去文件系統(tǒng)中找到這個文件,發(fā)送給瀏覽器,這里分發(fā)的是靜態(tài)數(shù)據(jù);如果客戶端現(xiàn)在請求的是 /index.php,根據(jù)配置文件,Nginx 知道這個不是靜態(tài)文件,需要去找 PHP 解析器來處理,那么它會把這個請求經(jīng)過簡單處理后交給PHP 解析器。Nginx 會傳哪些數(shù)據(jù)給 PHP 解析器呢?url 要有吧,查詢字符串也得有吧,POST 數(shù)據(jù)也要有,HTTP 請求頭 不能少吧,好的,CGI 就是規(guī)定要傳哪些數(shù)據(jù)、以什么樣的格式傳遞給后方處理這個請求的協(xié)議。
CGI 模式運行原理:當(dāng) Nginx 收到瀏覽器 /index.php 這個請求后,首先會創(chuàng)建一個對應(yīng)實現(xiàn)了 CGI 協(xié)議的進程,這里就是 php-cgi(PHP 解析器)。接下來 php-cgi 會解析 php.ini 文件,初始化執(zhí)行環(huán)境,然后處理請求,再以 CGI 規(guī)定的格式返回處理后的結(jié)果,退出進程。最后,Nginx 再把結(jié)果返回給瀏覽器。整個流程就是一個 Fork-And-Execute 模式。當(dāng)用戶請求數(shù)量非常多時,會大量擠占系統(tǒng)的資源如內(nèi)存、CPU 時間等,造成效能低下。所以在用 CGI 方式的服務(wù)器下,有多少個連接請求就會有多少個 CGI 子進程,子進程反復(fù)加載是 CGI 性能低下的主要原因。
CGI 模式的好處就是完全獨立于任何服務(wù)器,僅僅是做為一個中介:提供接口給 WEB 服務(wù)器和腳本語言或者是完全獨立編程語言。它們通過 CGI 協(xié)議搭線來完成數(shù)據(jù)傳遞。這樣做的好處了盡量減少它們之間的關(guān)聯(lián),使得各自更加獨立、互不影響。
CGI 模式已經(jīng)是比較古老的模式了,這幾年都很少用了。
根據(jù)定義可以知道,F(xiàn)astCGI 也是一種協(xié)議,實現(xiàn)了 FastCGI 協(xié)議的程序,更像是一個常駐型(long-live)的 CGI 協(xié)議程序,只要激活后,它可以一直執(zhí)行著,不會每次都要花費時間去 fork 一次。
FastCGI 模式運行原理:FastCGI 進程管理器啟動之后,首先會解析 php.ini 文件,初始化執(zhí)行環(huán)境,然后會啟動多個 CGI 協(xié)議解釋器守護進程 (進程管理中可以看到多個 php-cig 或 php-cgi.exe),并等待來自 WEB 服務(wù)器的連接;當(dāng)客戶端請求到達 WEB 服務(wù)器時,F(xiàn)astCGI 進程管理器會選擇并連接到一個 CGI 解釋器, WEB 服務(wù)器將 CGI環(huán)境變量和標準輸入發(fā)送到 FastCGI 的子進程 php-cgi 中; php-cgi 子進程完成處理后便將標準輸出和錯誤信息返回給 WEB 服務(wù)器;此時 php-cgi 子進程就會關(guān)閉連接,該請求便處理結(jié)束,接著繼續(xù)等待并處理來自 FastCGI 進程管理器的下一個請求連接。
FastCGI 模式采用了 C/S 結(jié)構(gòu),可以將 WEB 服務(wù)器和腳本解析服務(wù)器分開,同時在腳本解析服務(wù)器上啟動一個或者多個腳本解析守護進程。當(dāng) WEB 服務(wù)器每次遇到動態(tài)程序時,可以將其直接交付給 FastCGI 進程來執(zhí)行,然后將得到的結(jié)果返回給瀏覽器。這種方式可以讓 WEB 服務(wù)器專一地處理靜態(tài)請求或者將動態(tài)腳本服務(wù)器的結(jié)果返回給客戶端,這在很大程度上提高了整個應(yīng)用系統(tǒng)的性能。
另外,在 CGI 模式下,php-cgi 在 php.ini 配置變更后,需要重啟 php-cgi 進程才能讓新的 php-ini 配置生效,不可以平滑重啟。而在 FastCGI 模式下,PHP-FPM 可以通過生成新的子進程來實現(xiàn) php.ini 修改后的平滑重啟。
FastCGI 模式的優(yōu)點:
從穩(wěn)定性上看,F(xiàn)astCGI 模式是以獨立的進程池來運行 CGI 協(xié)議程序,單獨一個進程死掉,系統(tǒng)可以很輕易的丟棄,然后重新分配新的進程來運行邏輯;
從安全性上看,F(xiàn)astCGI 模式支持分布式運算。FastCGI 程序和宿主的 Server 完全獨立,F(xiàn)astCGI 程序掛了也不影響 Server;
從性能上看,F(xiàn)astCGI 模式把動態(tài)邏輯的處理從 Server 中分離出來,大負荷的 IO 處理還是留給宿主 Server,這樣宿主 Server 可以一心一意處理 IO,對于一個普通的動態(tài)網(wǎng)頁來說, 邏輯處理可能只有一小部分,大量的是圖片等靜態(tài)。
FastCGI 模式是目前 PHP 主流的 WEB 服務(wù)運行模式,擁有高效可靠的性能,推薦大家使用。
PHP 常常與 Apache 服務(wù)器搭配形成 LAMP 配套的運行環(huán)境。把 PHP 作為一個子模塊集成到 Apache 中,就是 Module 模式,Apache 中的常見配置如下:
LoadModule php5_module modules/mod_php5.so
這使用了 LoadModule 命令,該命令的第一個參數(shù)是模塊的名稱,名稱可以在模塊實現(xiàn)的源碼中找到。第二個選項是該模塊所處的路徑。如果需要在服務(wù)器運行時加載模塊,可以通過發(fā)送信號 HUP 或者 AP_SIG_GRACEFUL 給服務(wù)器,一旦接受到該信號,Apache 將重新裝載模塊,而不需要重新啟動服務(wù)器。通過注冊到 apache2 的 ap_hook_post_config 掛鉤,在 Apache 啟動的時候啟動此模塊以接受 PHP 文件的請求。
例如,當(dāng)客戶端訪問 PHP 文件時,Apache 就會調(diào)用 php5_module 來解析 PHP 腳本。Apache 每接收到一個請求,都會產(chǎn)生一個進程來連接 PHP 完成請求。在 Module 模式下,有時候會因為把 PHP 作為模塊編進 Apache,而導(dǎo)致出現(xiàn)問題時很難定位是 PHP 的問題還是 Apache 的問題。
ISAPI(Internet Server Application Program Interface)是微軟提供的一套面向 Internet 服務(wù)的 API 接口,一個 ISAPI 的 DLL,可以在被用戶請求激活后長駐內(nèi)存,等待用戶的另一個請求,還可以在一個 DLL 里設(shè)置多個用戶請求處理函數(shù),此外,ISAPI 的 DLL 應(yīng)用程序和 WEB 服務(wù)器處于同一個進程中,效率要顯著高于 CGI。由于微軟的排他性,只能運行于 Windows 環(huán)境。
用的比較少,在這里就不做詳細介紹了。

我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流