亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > PHP > 正文

PHP中register_shutdown_function函數的基礎介紹與用法詳解

2024-09-04 11:42:21
字體:
來源:轉載
供稿:網友

php中的異常捕獲沒有java的強大,有些情況下,需要知道某段php程序業務是否正常執行完,可以用register_shutdown_function函數來輔助實現,這篇文章主要給大家介紹了關于PHP中register_shutdown_function函數的基礎介紹與用法的相關資料,需要的朋友可以參考。

前言

最近在看《PHP核心技術與最佳實踐》,里面有使用到一個函數,register_shutdown_function,由于之前沒有用過該函數,就去查了一下資料,就覺得是個很實用的函數,所以這里寫一下這個函數的用法,下面話不多說了,來一起看看詳細的介紹吧。

1. 函數說明

定義:該函數是來注冊一個會在PHP中止時執行的函數

參數說明:

void register_shutdown_function ( callable $callback [, mixed $parameter [, mixed $... ]] )

注冊一個 callback ,它會在腳本執行完成或者 exit() 后被調用。

callback:待注冊的中止回調

parameter:可以通過傳入額外的參數來將參數傳給中止函數

2. PHP中止的情況

PHP中止的情況有三種:

執行完成

exit/die導致的中止

發生致命錯誤中止

a. 第一種情況,執行完成

  1. <?php  
  2. function test()  
  3. {  
  4.  echo '這個是中止方法test的輸出';  
  5. }  
  6.    
  7. register_shutdown_function('test');  
  8.    
  9. echo 'before' . PHP_EOL; 

運行:

before

這個是中止方法test的輸出

注意:輸出的順序,等執行完成了之后才會去執行register_shutdown_function的中止方法test

b. 第二種情況,exit/die導致的中止

  1. <?php  
  2. function test()  
  3. {  
  4.  echo '這個是中止方法test的輸出';  
  5. }  
  6.    
  7. register_shutdown_function('test');  
  8.    
  9. echo 'before' . PHP_EOL;  
  10. exit();  
  11. echo 'after' . PHP_EOL; 

運行:

before

這個是中止方法test的輸出

后面的after并沒有輸出,即exit或者是die方法導致提前中止。

c. 第三種情況,發送致命錯誤中止

  1. <?php  
  2. function test()  
  3. {  
  4.  echo '這個是中止方法test的輸出';  
  5. }  
  6.    
  7. register_shutdown_function('test');  
  8.    
  9. echo 'before' . PHP_EOL;  
  10.    
  11. // 這里會發生致命錯誤  
  12. $a = new a();  
  13.    
  14. echo 'after' . PHP_EOL; 

運行:

  1. before  
  2.    
  3. Fatal error: Uncaught Error: Class 'a' not found in D:/laragon/www/php_book/test.php on line 12  
  4.    
  5. Error: Class 'a' not found in D:/laragon/www/php_book/test.php on line 12  
  6.    
  7. Call Stack:  
  8.  0.0020  360760 1. {main}() D:/laragon/www/php_book/test.php:0  

這個是中止方法test的輸出

后面的after也是沒有輸出,致命錯誤導致提前中止了。

3. 參數

第一個參數支持以數組的形式來調用類中的方法,第二個以及后面的參數都是可以當做額外的參數傳給中止方法。

  1. <?php  
  2.    
  3. class Shutdown  
  4. {  
  5.  public function stop()  
  6.  {  
  7.   echo "這個是stop方法的輸出";  
  8.  }  
  9. }  
  10.    
  11. // 當PHP終止的時候(執行完成或者是遇到致命錯誤中止的時候)會調用new Shutdown的stop方法  
  12. register_shutdown_function([new Shutdown(), 'stop']);  
  13.    
  14. // 將因為致命錯誤而中止  
  15. $a = new a();  
  16.    
  17. // 這一句并沒有執行,也沒有輸出  
  18. echo '必須終止'

也可以在類中執行:

  1. <?php  
  2.    
  3. class TestDemo {  
  4.  public function __construct()  
  5.  {  
  6.   register_shutdown_function([$this"f"], "hello");  
  7.  }  
  8.    
  9.  public function f($str)  
  10.  {  
  11.   echo "class TestDemo->f():" . $str;  
  12.  }  
  13. }  
  14.    
  15. $demo = new TestDemo();  
  16. echo 'before' . PHP_EOL;  
  17.    
  18. /**  
  19. 運行:  
  20. before  
  21. class TestDemo->f():hello  
  22.  */ 

4. 同時調用多個

可以多次調用 register_shutdown_function,這些被注冊的回調會按照他們注冊時的順序被依次調用。

不過注意的是,如果在第一個注冊的中止方法里面調用exit方法或者是die方法的話,那么其他注冊的中止回調也不會被調用。

代碼:

  1. <?php  
  2. /**  
  3.  * 可以多次調用 register_shutdown_function,這些被注冊的回調會按照他們注冊時的順序被依次調用。  
  4.  * 注意:如果你在f方法(第一個注冊的方法)里面調用exit方法或者是die方法的話,那么其他注冊的中止回調也不會被調用  
  5.  */ 
  6.    
  7. /**  
  8.  * @param $str  
  9.  */ 
  10. function f($str) {  
  11.  echo $str . PHP_EOL;  
  12.    
  13.  // 如果下面調用exit方法或者是die方法的話,其他注冊的中止回調不會被調用  
  14.  // exit();  
  15. }  
  16.    
  17. // 注冊第一個中止回調f方法  
  18. register_shutdown_function("f""hello");  
  19.    
  20. class TestDemo {  
  21.  public function __construct()  
  22.  {  
  23.   register_shutdown_function([$this"f"], "hello");  
  24.  }  
  25.    
  26.  public function f($str)  
  27.  {  
  28.   echo "class TestDemo->f():" . $str;  
  29.  }  
  30. }  
  31.    
  32. $demo = new TestDemo();  
  33. echo 'before' . PHP_EOL;  
  34.    
  35. /**  
  36. 運行:  
  37. before  
  38. hello  
  39. class TestDemo->f():hello  

注意:如果f方法里面調用了exit或者是die的話,那么最后的class TestDemo->f():hello不會輸出 */

5. 用處

該函數的作用:

析構函數:在PHP4的時候,由于類不支持析構函數,所以這個函數經常用來模擬實現析構函數

致命錯誤的處理:使用該函數可以用來捕獲致命錯誤并且在發生致命錯誤后恢復流程處理

代碼如下:

  1. <?php  
  2. /**  
  3.  * register_shutdown_function,注冊一個會在php中止時執行的函數,中止的情況包括發生致命錯誤、die之后、exit之后、執行完成之后都會調用register_shutdown_function里面的函數  
  4.  * Created by PhpStorm.  
  5.  * User: Administrator  
  6.  * Date: 2017/7/15  
  7.  * Time: 17:41  
  8.  */ 
  9.    
  10. class Shutdown  
  11. {  
  12.  public function stop()  
  13.  {  
  14.   echo 'Begin.' . PHP_EOL;  
  15.   // 如果有發生錯誤(所有的錯誤,包括致命和非致命)的話,獲取最后發生的錯誤  
  16.   if (error_get_last()) {  
  17.    print_r(error_get_last());  
  18.   }  
  19.    
  20.   // ToDo:發生致命錯誤后恢復流程處理  
  21.    
  22.   // 中止后面的所有處理  
  23.   die('Stop.');  
  24.  }  
  25. }  
  26.    
  27. // 當PHP終止的時候(執行完成或者是遇到致命錯誤中止的時候)會調用new Shutdown的stop方法  
  28. register_shutdown_function([new Shutdown(), 'stop']);  
  29.    
  30. // 將因為致命錯誤而中止  
  31. $a = new a();  
  32.    
  33. // 這一句并沒有執行,也沒有輸出  
  34. echo '必須終止'

運行:

  1. Fatal error: Uncaught Error: Class 'a' not found in D:/laragon/www/php_book/1_23_register_shutdown.php on line 31  
  2.    
  3. Error: Class 'a' not found in D:/laragon/www/php_book/1_23_register_shutdown.php on line 31  
  4.    
  5. Call Stack:  
  6.  0.0060  362712 1. {main}() D:/laragon/www/php_book/1_23_register_shutdown.php:0  
  7.    
  8. Begin.  
  9. Array  
  10. (  
  11.  [type] => 1  
  12.  [message] => Uncaught Error: Class 'a' not found in D:/laragon/www/php_book/1_23_register_shutdown.php:31  
  13. Stack trace:  
  14. #0 {main}  
  15.  thrown  
  16.  [file] => D:/laragon/www/php_book/1_23_register_shutdown.php  
  17.  [line] => 31  
  18. )  
  19. Stop. 

注意:PHP7中新增了Throwable異常類,這個類可以捕獲致命錯誤,即可以使用try...catch(Throwable $e)來捕獲致命錯誤,代碼如下:

  1. <?php  
  2.    
  3. try {  
  4.  // 將因為致命錯誤而中止  
  5.  $a = new a();  
  6.    
  7.  // 這一句并沒有執行,也沒有輸出  
  8.  echo 'end';  
  9. } catch (Throwable $e) {  
  10.  print_r($e);  
  11.  echo $e->getMessage();  

運行:

  1. Error Object  
  2. (  
  3.  [message:protected] => Class 'a' not found  
  4.  [string:Error:private] =>  
  5.  [code:protected] => 0  
  6.  [file:protected] => C:/laragon/www/php_book/throwable.php  
  7.  [line:protected] => 5  
  8.  [trace:Error:private] => Array  
  9.   (  
  10.   )  
  11.    
  12.  [previous:Error:private] =>  
  13.  [xdebug_message] =>  
  14. Error: Class 'a' not found in C:/laragon/www/php_book/throwable.php on line 5  
  15.    
  16. Call Stack:  
  17.  0.0000  349856 1. {main}() C:/laragon/www/php_book/throwable.php:0  
  18.    
  19. )  
  20. Class 'a' not found 

這樣的話,PHP7中使用Throwable來捕獲的話比使用register_shutdown_function這個函數來得更方便,也更推薦Throwable。

注意:Error類也是可以捕獲到致命錯誤,不過Error只能捕獲致命錯誤,不能捕獲異常Exception,而Throwable是可以捕獲到錯誤和異常的,所以更推薦。

6.巧用register_shutdown_function判斷php程序是否執行完

還有一種應用場景就是:要做一個消費隊列,因為某條有問題的數據導致致命錯誤,如果這條數據不處理掉,那么整個隊列都會導致癱瘓的狀態,這樣可以用以下方法來解決。即:如果捕獲到有問題的數據導致錯誤,則在回調函數中將這條數據處理掉就可以了。

php范例參考與解析:

  1. <?php 
  2.  
  3. register_shutdown_function('myFun'); //放到最上面,不然如果下面有致命錯誤,就不會調用myFun了。 
  4. $execDone = false; //程序是否成功執行完(默認為false) 
  5.  
  6. /** 
  7. ********************* 業務邏輯區************************* 
  8. */ 
  9. $tas = 3; 
  10. if($tas == 3) 
  11. new daixiaorui(); 
  12.  
  13. /** 
  14. ********************* 業務邏輯結束************************* 
  15. */ 
  16. $execDone = true; //由于程序由上至下執行,因此當執行到此后,則證明邏輯沒有出現致命的錯誤。 
  17.  
  18. function myFun() 
  19. global $execDone
  20. if($execDone === false) 
  21. file_put_contents("E:/myMsg.txt"date("Y-m-d H:i:s")."---error: 程序執行出錯。/r/n", FILE_APPEND); 
  22. /******** 以下可以做一些處理 ********/ 

總結

register_shutdown_function這個函數主要是用在處理致命錯誤的后續處理上(PHP7更推薦使用Throwable來處理致命錯誤),不過缺點也很明顯,只能處理致命錯誤Fatal error,其他的錯誤包括最高錯誤Parse error也是沒辦法處理的。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
5566日本婷婷色中文字幕97| 国产精品白嫩美女在线观看| 久久久999精品视频| 日韩第一页在线| 国产成一区二区| 国产日韩精品入口| 久久综合伊人77777| 欧美有码在线观看| 狠狠做深爱婷婷久久综合一区| 国产精品揄拍500视频| 2019中文字幕在线免费观看| 欧美成人一区二区三区电影| 91久久久亚洲精品| 亚洲天堂网在线观看| 欧美福利视频在线观看| 国产精品永久在线| 92版电视剧仙鹤神针在线观看| 亚洲国产日韩欧美在线动漫| 国产精品人人做人人爽| 4k岛国日韩精品**专区| 国产成人一区二区三区| 韩国日本不卡在线| 一本色道久久88精品综合| 国产91精品久久久| 91香蕉嫩草影院入口| 亚洲最大福利视频网| 国产99久久精品一区二区| 91国内产香蕉| 日韩美女视频免费在线观看| 精品视频在线播放| 欧美极品少妇xxxxⅹ免费视频| 亚洲欧美国产精品久久久久久久| 国产69精品99久久久久久宅男| 国产美女精品视频免费观看| 亚洲精品永久免费| 精品美女永久免费视频| 欧美日韩性视频| 日本精品久久电影| 成人国产精品久久久久久亚洲| 中文字幕亚洲欧美日韩在线不卡| 俺去亚洲欧洲欧美日韩| 日本亚洲欧洲色| 热门国产精品亚洲第一区在线| 国产精品网红直播| 国产手机视频精品| 国产日韩欧美综合| 激情懂色av一区av二区av| 久久精品夜夜夜夜夜久久| 97人洗澡人人免费公开视频碰碰碰| 成人性生交大片免费看视频直播| 在线日韩第一页| 欧美亚洲国产视频小说| 国产精品国产三级国产专播精品人| 超碰日本道色综合久久综合| 免费97视频在线精品国自产拍| 亚洲视频在线免费观看| 亚洲一区二区中文字幕| 亚洲欧美国产精品专区久久| 欧美主播福利视频| 亚洲色图综合网| 亚洲国产97在线精品一区| 久久久久99精品久久久久| 91最新国产视频| 97在线视频国产| 另类少妇人与禽zozz0性伦| 欧美又大粗又爽又黄大片视频| 精品国产精品自拍| 久久久爽爽爽美女图片| 日本不卡高字幕在线2019| 欧美性在线观看| 日韩亚洲国产中文字幕| 欧美激情免费视频| 欧洲美女7788成人免费视频| 日韩在线视频观看正片免费网站| 亚洲激情中文字幕| 日韩av在线导航| 国产精品免费一区豆花| 亚洲电影中文字幕| 欧美性理论片在线观看片免费| 国产精品综合不卡av| 激情av一区二区| 97在线观看视频国产| 91在线色戒在线| 播播国产欧美激情| 欧美性videos高清精品| 在线电影欧美日韩一区二区私密| 黑人极品videos精品欧美裸| 久久久久亚洲精品国产| 国产精品www色诱视频| 九九热精品视频| 亚洲国产精品专区久久| 欧美性xxxx极品hd满灌| 7m精品福利视频导航| 日韩成人av在线播放| 亚洲国产精品福利| 日韩在线观看网站| 日韩视频一区在线| 日韩av大片免费看| 久久韩国免费视频| 日韩亚洲第一页| 国产精品www网站| 北条麻妃一区二区在线观看| 亚洲国产日韩一区| 中文字幕一区二区三区电影| 国产精品美女久久| 久久久精品久久| 国产精品久久久久久久午夜| 国产精品国产三级国产aⅴ9色| 国产精品久久久久久av福利| 欧美成人精品不卡视频在线观看| 欧美电影在线观看高清| 97超级碰碰碰久久久| www.国产精品一二区| 国产综合久久久久| 自拍偷拍亚洲精品| 亚洲精品久久久久久下一站| 亚洲欧美资源在线| 亚洲毛片在线观看.| 久久综合九色九九| 成人精品一区二区三区电影免费| 色阁综合伊人av| 亚洲午夜激情免费视频| 亚洲精品一区二区三区婷婷月| 成人国产精品一区二区| 欧美另类69精品久久久久9999| 国产成人综合一区二区三区| 91亚洲精品一区二区| 亚洲缚视频在线观看| 国产v综合v亚洲欧美久久| 欧美性xxxxxxxxx| 久久精品亚洲94久久精品| 亚洲人成电影网站色xx| 久久久久www| 日韩欧美在线观看视频| 国产精品美女在线| 少妇精69xxtheporn| 亚洲国产成人爱av在线播放| 欧美激情2020午夜免费观看| 精品久久久久久久久久久久久久| 成人福利视频在线观看| 18一19gay欧美视频网站| 色偷偷av一区二区三区| 97视频在线观看播放| 久久久久久综合网天天| 伊人久久精品视频| 亚洲女人天堂av| 国产在线视频一区| 国产在线精品成人一区二区三区| 一区二区三区无码高清视频| 欧美极品在线播放| 蜜臀久久99精品久久久无需会员| 91视频免费网站| 久久久国产一区二区| 中文字幕少妇一区二区三区| 国产性色av一区二区| www.日本久久久久com.| 久久人人看视频| 久久精品视频在线观看| 亚洲亚裔videos黑人hd| 日韩欧美在线观看| 国产精品永久免费在线| y97精品国产97久久久久久| 中文字幕视频一区二区在线有码| 最新国产精品拍自在线播放|