PHP fastcgi_finish_request 方法

訢亮發表於2017-03-31

本文介紹,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。

關注微信公眾號,留言即可,看到留言後會及時回覆。

PHP fastcgi_finish_request 方法
IT小圈兒

相關文章