exit() 時或之後還能繼續執行php程式碼的幾種辦法

咖啡色的羊駝發表於2016-03-16

這個是很早以前公司群討論的一個話題,於是做了個總結

1.解構函式 __destruct()

點評:魔術方法一向逼格高,它還有個基友__construct()

2.register_shutdown_function()

點評:這個函式屬於回馬槍的型別,藝名:回撥函式。最好在指令碼開始時註冊,如果有記日誌或者xhprof等效能分析等有一定耗時的程式碼,可在這個函式中定義回撥去執行,可提高客戶端相應時間。
⚠:函式可多次註冊,回撥時候會安順序進行

3.fastcgi_finish_request()

點評:這個函式需要執行在Fastcgi的模式下,php-fpm會提供這個方法來使用,所以在一定程度上會提高客戶端的響應時間,在響應結束後會繼續執行後面的程式碼,以達到非同步的效果。

<?php
echo '我是會輸出的';
file_put_content('./zb.txt', date('Y-m-d H:i:s')."我是來記日誌的\n", FILE_APPEND);

fastcgi_finish_request();

echo '我是不會輸出的';
sleep(5);
file_put_content('./zb.txt', date('Y-m-d H:i:s')."來我又來記日誌了\n", FILE_APPEND);
?>

sleep(5)用來模擬耗時的操作,執行程式碼會發現,只輸出了第一個
echo的內容,看日誌也會看到記了兩個log。

fastcgi_finish_request()是七傷拳傷人先傷己,後面來講講怎麼傷己的。
1.如果不是php-fpm的模式執行php程式碼,執行這個函式會報錯,建議補上:

if (!function_exists("fastcgi_finish_request")) {
    function fastcgi_finish_request() {}
}

2.由於Fastcgi的程式數是有限的,正在非同步處理的操作會佔著一個php-cgi程式,會導致無法處理新的請求,假設正好此時併發訪問量突增,新的請求將沒有php-cgi去處理,此時就
這裡寫圖片描述

Nginx伺服器會出現:
這裡寫圖片描述

3.這個函式後面如果執行的東西太耗時,建議看情況調大php.ini 的max_execution_time (預設30s) 設定,或者set_time_limit(0) 一下,這樣當前程式執行就不會超時了。

未完待續,如果你還有其他辦法記得和我交流。謝謝

相關文章