摘要:register_shutdown_function定義:該函數是來注冊一個會在PHP中止時執行的函數參數說明:register_shutdown_function ($callback, $para...
register_shutdown_function
定義:該函數是來注冊一個會在PHP中止時執行的函數
參數說明:register_shutdown_function ($callback, $parameter)
注冊一個 callback ,它會在腳本執行完成或者 exit() 后被調用。
$callback:待注冊的中止回調[必須]
$parameter:可以通過傳入額外的參數來將參數傳給中止函數[可選]
可以多次調用 register_shutdown_function() ,這些被注冊的回調會按照他們注冊時的順序被依次調用。 如果你在注冊的方法內部調用 exit(), 那么所有處理會被中止,并且其他注冊的中止回調也不會再被調用。
PHP中止的情況有三種:
1.程序執行完成;
2.exit/die導致的中止;
3.發生致命錯誤中止;
例1(程序執行完成):
register_shutdown_function('test'); function test() { echo '這個是中止方法test的輸出'; } echo '結束代碼<br>';
運行結果:
結束代碼 這個是中止方法test的輸出
例2(exit導致的中止):
register_shutdown_function('test'); function test() { echo '這個是中止方法test的輸出'; } exit(); echo '結束代碼<br>';
運行結果:
這個是中止方法test的輸出
例3(發生致命錯誤中止):
register_shutdown_function('test'); function test() { echo '這個是中止方法test的輸出'; } // 這里會發生致命錯誤 $a = new a(); echo '結束代碼<br>';
運行結果:
Fatal error: Class 'a' not found in E:\phpStudy\PHPTutorial\WWW\a.php on line 47 這個是中止方法test的輸出
例4(在類中的使用):
class test { public function __construct() { register_shutdown_function(array($this, 'a'), 'hello'); } public function a($str) { echo "class test->a():" . $str; } } $t = new test; echo '結束代碼<br>';
運行結果:
結束代碼 class test->a():hello
注意,以下兩種情況不會執行回調函數:
1.程序有語法錯誤;
2.register_shutdown_function函數前,發生了致命錯誤;
學以致用:
可以使用該函數可以用來捕獲致命錯誤并且在發生致命錯誤后恢復流程處理!
例如要做一個消費隊列,因為某條有問題的數據導致致命錯誤,如果這條數據不處理掉,那么整個隊列都會導致癱瘓的狀態,這樣可以用以下方法來解決。即:如果捕獲到有問題的數據導致錯誤,則在回調函數中將這條數據處理掉就可以了。
網友評論:
管理員 回復 YzmCMS博客網友 :最好的辦法就是記錄日志,當有異常發生時,記錄日志,然后就可以排查出哪里出的問題了
2018-04-27 13:32:01 回復
網友評論:
請問所謂的處理掉異常的數據怎么處理?在里面根本就無從知道隊列發生知名錯誤的 是哪一條,就是假設你數據里面的第10條數據產生了錯誤,但里面根本無從知道是第10條數據錯了
2018-04-27 11:54:40 回復