本文介紹,PHP執行在FastCGI模式時,FPM提供的方法:fastcgi_finish_request。
在說這個方法之前,我們先了解PHP有哪些常用的執行模式?
PHP執行模式
CGI 通用閘道器介面 / Common Gateway Interface
CGI已經是比較老的模式了,這幾年都很少用了。
介紹:每有一個使用者請求,都會先要建立CGI的子程式,然後處理請求,處理完後結束這個子程式,這就是Fork-And-Execute模式。
當使用者請求數量非常多時,會大量擠佔系統的資源如記憶體,CPU時間等。
缺點:在高訪問需求的情況下,CGI的程式Fork就會成為很大的伺服器負擔。
FastCGI(常駐型CGI / Long-Live CGI)
使用的比較多。
介紹:FastCGI是CGI的升級版本,FastCGI像是一個常駐 (long-live)型的 CGI。
它可以一直執行著,只要啟用後,不會每次都要花費時間去 Fork 一次。
FastCGI是一個可伸縮地、高速地在HTTP server和動態指令碼語言間通訊的介面。
Apache、Nginx、lighttpd 等流行的 HTTP server 都支援FastCGI。
原理:
1.Web Server啟動時載入FastCGI程式管理器(PHP-FPM);
2.FastCGI程式管理器初始化啟動多個CGI直譯器程式並等待來自Web Server的連線;
3.當客戶端請求到達Web Server時,FastCGI程式管理器選擇並連線到一個CGI直譯器;
4.Web server將CGI環境變數和標準輸入傳送到FastCGI子程式php-cgi;
5.FastCGI子程式完成處理後將標準輸出和錯誤資訊從同一連線返回Web Server。
當FastCGI子程式關閉連線時,請求便告處理完成。
FastCGI子程式接著等待並處理來自FastCGI程式管理器的下一個連線。
CLI模式
介紹:PHP-CLI是PHP Command Line Interface的簡稱,就是PHP在命令列中執行。
Windows、Linux下都支援PHP-CLI模式。
模組模式
介紹:模組模式是以mod_php5模組的形式整合的。
mod_php5模組的作用是接收Apache傳遞過來的PHP檔案請求,並處理這些請求,然後將處理後的結果返回給Apache。
Apache的配置檔案httpd.conf中新增一行:
LoadModule php5_module modules/mod_php5.so複製程式碼
以上只是簡單的讓大家瞭解下,如果有興趣可以查閱相關文章。
接下來,我們來介紹:fastcgi_finish_request。
fastcgi_finish_request
PHP執行在FastCGI模式時,FPM提供的方法:fastcgi_finish_request。
官方地址:php.net/manual/zh/f…
官方解釋:沖刷(flush)所有響應的資料給客戶端。
個人理解:在呼叫方法的時候,會傳送響應,關閉連線,但是不會結束PHP的執行。
不理解的可以直接執行如下程式碼:
//程式碼:
echo date('Y-m-d H:i:s', time())."\r\n"; //會輸出
fastcgi_finish_request();
set_time_limit(0); //避免超時報錯
ini_set('memory_limit', '-1'); //避免記憶體不足
sleep(5);
$time = date('Y-m-d H:i:s', time())."\r\n";
echo $time; //不會輸出
file_put_contents('test.txt', $time, FILE_APPEND);複製程式碼
執行這段函式後你會發現,可以實現非同步操作,提高響應速度。
可以使用fastcgi_finish_request()函式整合佇列,可以把訊息非同步傳送到佇列。
因為這個函式只在FastCGI模式下存在,考慮可移植性可以加上以下程式碼:
if (!function_exists("fastcgi_finish_request")) {
function fastcgi_finish_request() {
}
}複製程式碼
大家可以根據自己的情況,進行嘗試使用~
作者:PHP後端開發者
提供技術相關服務(自己懂的知識)。
QQ群:564557094。
關注微信公眾號,留言即可,看到留言後會及時回覆。