PHP有多種運行模式,常見的Fast-CGI,PHP-FPM模式我們歸納為傳統的web模式,還有一種模式屬于命令行模式:PHP-Cli。他們之間有著怎么樣的區別,看本文就夠了。
CGI協議模式
CGI模式是指通用網關接口(Common Gateway Interface),它允許web服務器通過特定的協議與應用程序通信, 調用原理大概為:
用戶請求->Web服務器接收請求->fork子進程 調用程序/執行程序->程序返回內容/程序調用結束->web服務器接收內容->返回給用戶 。
由于每次用戶請求,都得fork創建進程調用一次程序,然后銷毀進程,所以性能較低。
Fast-CGI 協議模式
Fast-CGI是CGI模式的升級版,它像是一個常駐型的cgi,只要開啟后,就可一直處理請求,不再需要結束進程, 調用原理大概為:
web服務器fast-cgi進程管理器初始化->預先fork n個進程
用戶請求->web服務器接收請求->交給fast-cgi進程管理器->fast-cgi進程管理區接收,給其中一個空閑fast-cgi進程處理->
處理完成,fast-cgi進程變為空閑狀態,等待下次請求->web服務器接收內容->返回給用戶。
注意,Fast-CGI和CGI都是一種協議,開啟的進程是單獨實現該協議的進程。
PHP-FPM模式
PHP-FPM(FastCGI 進程管理器)用于替換 PHP FastCGI 的大部分附加功能,對于高負載網站是非常有用的。
它的功能包括:
支持平滑停止/啟動的高級進程管理功能;
可以工作于不同的 uid/gid/chroot 環境下,并監聽不同的端口和使用不同的 php.ini 配置文件(可取代 safe_mode 的設置);
stdout 和 stderr 日志記錄;
在發生意外情況的時候能夠重新啟動并緩存被破壞的 opcode;
文件上傳優化支持;
"慢日志" - 記錄腳本(不僅記錄文件名,還記錄 PHP backtrace 信息,可以使用 ptrace或者類似工具讀取和分析遠程進程的運行數據)運行所導致的異常緩慢;
fastcgi_finish_request() - 特殊功能:用于在請求完成和刷新數據后,繼續在后臺執行耗時的工作(錄入視頻轉換、統計處理等);
動態/靜態子進程產生;
基本 SAPI 運行狀態信息(類似Apache的 mod_status);
基于 php.ini 的配置文件。
PHP-FPM的工作原理大概為:
php-fpm啟動->生成n個fast-cgi協議處理進程->監聽一個端口等待任務
用戶請求->web服務器接收請求->請求轉發給php-fpm->php-fpm交給一個空閑進程處理 ->進程處理完成->php-fpm返回給web服務器->web服務器接收數據->返回給用戶。
PHP-Cli模式
php-cli模式屬于命令行模式,對于很多剛開始學php就開始wamp,wnmp的開發者來說是最陌生的一種運行模式。
該模式不需要借助其他程序,直接在控制臺輸入php xx.php 就能執行php代碼。
命令行模式和常規傳統的web模式明顯不一樣的是:
沒有超時時間
默認關閉buffer緩沖
STDIN和STDOUT標準輸入/輸出/錯誤 的使用
echo var_dump,phpinfo等輸出直接輸出到控制臺
可使用的類/函數 不同
php.ini配置的不同
在php-cli中,是沒有超時時間的,也無法通過 set_time_limit 設置超時時間,舉個栗子:
<?php
set_time_limit(30);
while (1){
echo 1;
sleep(1);
}
這段代碼,在常規web下運行,只要到30秒就會報Fatal error: Maximum execution time of 30 seconds exceeded in ......這樣的錯誤。
而在php-cli中,這段代碼將會一直執行,一直輸出1到控制臺中。
php有些擴展在常規web下運行時沒用/沒有意義的,例如:
swoole擴展
socket擴展
模塊模式
Apache+PHP運行時,默認使用的是模塊模式,它把php作為apache的模塊隨apache啟動而啟動,接收到用戶請求時則直接通過調用mod_php模塊進行處理,詳細內容可自行百度。