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

首頁 > 語言 > PHP > 正文

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

2024-05-05 00:01:16
字體:
來源:轉載
供稿:網友

前言

最近在看《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. 第一種情況,執行完成

<?php function test() {  echo '這個是中止方法test的輸出'; }  register_shutdown_function('test');  echo 'before' . PHP_EOL; 

運行:

before 這個是中止方法test的輸出 

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

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

<?php function test() {  echo '這個是中止方法test的輸出'; }  register_shutdown_function('test');  echo 'before' . PHP_EOL; exit(); echo 'after' . PHP_EOL; 

運行:

before 這個是中止方法test的輸出 

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

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

<?php function test() {  echo '這個是中止方法test的輸出'; }  register_shutdown_function('test');  echo 'before' . PHP_EOL;  // 這里會發生致命錯誤 $a = new a();  echo 'after' . PHP_EOL;

運行:

before  Fatal error: Uncaught Error: Class 'a' not found in D:/laragon/www/php_book/test.php on line 12  Error: Class 'a' not found in D:/laragon/www/php_book/test.php on line 12  Call Stack:  0.0020  360760 1. {main}() D:/laragon/www/php_book/test.php:0  這個是中止方法test的輸出 

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

3. 參數

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

<?php  class Shutdown {  public function stop()  {   echo "這個是stop方法的輸出";  } }  // 當PHP終止的時候(執行完成或者是遇到致命錯誤中止的時候)會調用new Shutdown的stop方法 register_shutdown_function([new Shutdown(), 'stop']);  // 將因為致命錯誤而中止 $a = new a();  // 這一句并沒有執行,也沒有輸出 echo '必須終止'; 

也可以在類中執行:

<?php  class TestDemo {  public function __construct()  {   register_shutdown_function([$this, "f"], "hello");  }   public function f($str)  {   echo "class TestDemo->f():" . $str;  } }  $demo = new TestDemo(); echo 'before' . PHP_EOL;  /** 運行: before class TestDemo->f():hello  */ 

4. 同時調用多個

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

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

<?php /**  * 可以多次調用 register_shutdown_function,這些被注冊的回調會按照他們注冊時的順序被依次調用。  * 注意:如果你在f方法(第一個注冊的方法)里面調用exit方法或者是die方法的話,那么其他注冊的中止回調也不會被調用  */  /**  * @param $str  */ function f($str) {  echo $str . PHP_EOL;   // 如果下面調用exit方法或者是die方法的話,其他注冊的中止回調不會被調用  // exit(); }  // 注冊第一個中止回調f方法 register_shutdown_function("f", "hello");  class TestDemo {  public function __construct()  {   register_shutdown_function([$this, "f"], "hello");  }   public function f($str)  {   echo "class TestDemo->f():" . $str;  } }  $demo = new TestDemo(); echo 'before' . PHP_EOL;  /** 運行: before hello class TestDemo->f():hello  注意:如果f方法里面調用了exit或者是die的話,那么最后的class TestDemo->f():hello不會輸出  */ 

5. 用處

該函數的作用:

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

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

代碼如下:

<?php /**  * register_shutdown_function,注冊一個會在php中止時執行的函數,中止的情況包括發生致命錯誤、die之后、exit之后、執行完成之后都會調用register_shutdown_function里面的函數  * Created by PhpStorm.  * User: Administrator  * Date: 2017/7/15  * Time: 17:41  */  class Shutdown {  public function stop()  {   echo 'Begin.' . PHP_EOL;   // 如果有發生錯誤(所有的錯誤,包括致命和非致命)的話,獲取最后發生的錯誤   if (error_get_last()) {    print_r(error_get_last());   }    // ToDo:發生致命錯誤后恢復流程處理    // 中止后面的所有處理   die('Stop.');  } }  // 當PHP終止的時候(執行完成或者是遇到致命錯誤中止的時候)會調用new Shutdown的stop方法 register_shutdown_function([new Shutdown(), 'stop']);  // 將因為致命錯誤而中止 $a = new a();  // 這一句并沒有執行,也沒有輸出 echo '必須終止'; 

運行:

Fatal error: Uncaught Error: Class 'a' not found in D:/laragon/www/php_book/1_23_register_shutdown.php on line 31  Error: Class 'a' not found in D:/laragon/www/php_book/1_23_register_shutdown.php on line 31  Call Stack:  0.0060  362712 1. {main}() D:/laragon/www/php_book/1_23_register_shutdown.php:0  Begin. Array (  [type] => 1  [message] => Uncaught Error: Class 'a' not found in D:/laragon/www/php_book/1_23_register_shutdown.php:31 Stack trace: #0 {main}  thrown  [file] => D:/laragon/www/php_book/1_23_register_shutdown.php  [line] => 31 ) Stop. 

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

<?php  try {  // 將因為致命錯誤而中止  $a = new a();   // 這一句并沒有執行,也沒有輸出  echo 'end'; } catch (Throwable $e) {  print_r($e);  echo $e->getMessage(); } 

運行:

Error Object (  [message:protected] => Class 'a' not found  [string:Error:private] =>  [code:protected] => 0  [file:protected] => C:/laragon/www/php_book/throwable.php  [line:protected] => 5  [trace:Error:private] => Array   (   )   [previous:Error:private] =>  [xdebug_message] => Error: Class 'a' not found in C:/laragon/www/php_book/throwable.php on line 5  Call Stack:  0.0000  349856 1. {main}() C:/laragon/www/php_book/throwable.php:0  ) Class 'a' not found 

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

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

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

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

php范例參考與解析:

<?phpregister_shutdown_function('myFun'); //放到最上面,不然如果下面有致命錯誤,就不會調用myFun了。$execDone = false; //程序是否成功執行完(默認為false)/*********************** 業務邏輯區**************************/$tas = 3;if($tas == 3){new daixiaorui();}/*********************** 業務邏輯結束**************************/$execDone = true; //由于程序由上至下執行,因此當執行到此后,則證明邏輯沒有出現致命的錯誤。function myFun(){global $execDone;if($execDone === false){file_put_contents("E:/myMsg.txt", date("Y-m-d H:i:s")."---error: 程序執行出錯。/r/n", FILE_APPEND);/******** 以下可以做一些處理 ********/}}

總結

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

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久久久av| 久久精品中文字幕免费mv| 欧美在线视频免费| 91色琪琪电影亚洲精品久久| 久久久久久久久网站| 国产精品美女www| 亚洲欧美国产日韩天堂区| 青青久久aⅴ北条麻妃| 国产精品91在线观看| 亚洲精品ady| 国产成人精品电影久久久| 91超碰caoporn97人人| 久久中文字幕在线视频| 国产精品毛片a∨一区二区三区|国| 日韩免费视频在线观看| 午夜精品久久久久久久99热浪潮| 俺去亚洲欧洲欧美日韩| 国产精品亚洲第一区| 性欧美办公室18xxxxhd| 欧美激情中文字幕乱码免费| 国产偷国产偷亚洲清高网站| 久久精品亚洲热| 欧美性猛交xxx| 亚洲性猛交xxxxwww| 午夜精品蜜臀一区二区三区免费| 日本a级片电影一区二区| 韩曰欧美视频免费观看| 2019中文在线观看| 亚洲人成在线观看网站高清| 欧美乱妇高清无乱码| 国产精品观看在线亚洲人成网| 91在线网站视频| 91免费看国产| 在线观看欧美成人| 国产在线精品播放| 在线视频日本亚洲性| 欧美性xxxx极品高清hd直播| 国产精品久久久久久久久久久新郎| 国产精品免费久久久久久| 欧美激情亚洲一区| 欧美精品中文字幕一区| 国产精品丝袜白浆摸在线| 精品日韩美女的视频高清| 精品在线欧美视频| 亚洲天堂av综合网| 国产成人亚洲精品| 亚洲人成五月天| 亚洲一区二区三区视频| 欧美成人黑人xx视频免费观看| 亚洲精品网址在线观看| 成人在线视频网站| 亚洲va电影大全| 欧美精品videos另类日本| 国产日韩在线观看av| 久久视频在线视频| 国产精品一二三在线| 97视频在线观看免费高清完整版在线观看| 亚洲香蕉伊综合在人在线视看| 91色琪琪电影亚洲精品久久| 日韩专区在线观看| 欧美日韩高清区| 91探花福利精品国产自产在线| 国产成人jvid在线播放| 精品久久久国产| 日韩视频一区在线| 中文字幕在线看视频国产欧美在线看完整| 2019中文字幕免费视频| 国产视频在线观看一区二区| 97精品久久久| 欧美中文在线免费| 欧美亚洲在线播放| 中文字幕亚洲二区| 成人精品在线观看| 欧美成人三级视频网站| 97在线精品国自产拍中文| 91禁国产网站| 最近2019年好看中文字幕视频| 亚洲美女福利视频网站| 久久的精品视频| 国产在线拍偷自揄拍精品| 久久综合网hezyo| 成人淫片在线看| www.欧美视频| 国产精品爽爽爽| 这里只有精品视频| 日本在线观看天堂男亚洲| 97人人模人人爽人人喊中文字| 中国人与牲禽动交精品| 久久视频这里只有精品| 日韩视频一区在线| xvideos亚洲人网站| 久久久久这里只有精品| 国产精品亚洲综合天堂夜夜| 欧美高清视频在线播放| 色偷偷888欧美精品久久久| 国产专区精品视频| 欧美交受高潮1| 色噜噜狠狠色综合网图区| www日韩中文字幕在线看| 欧亚精品在线观看| 激情成人在线视频| 国产精品视频在线观看| 亚洲嫩模很污视频| 精品网站999www| 国产日韩精品视频| 91久久精品国产| 亚洲天堂网在线观看| 国产有码一区二区| 欧美在线激情视频| 亚洲欧美第一页| 亚洲xxxx妇黄裸体| 日韩av有码在线| 亚洲第一区中文字幕| 成人性教育视频在线观看| 久久天堂电影网| 中文字幕欧美日韩在线| 国产精品美女www爽爽爽视频| 成人在线视频网| 欧美中文字幕在线| 久久久久久久久久久久av| 久久久国产一区二区| 精品一区二区亚洲| 成人日韩av在线| 欧美视频13p| 91sao在线观看国产| 中文字幕自拍vr一区二区三区| 亚洲人成77777在线观看网| 欧美三级免费观看| 亚洲综合社区网| 一本色道久久综合亚洲精品小说| 亚洲人精选亚洲人成在线| 国产精品嫩草影院久久久| 日韩高清电影免费观看完整版| 色综合91久久精品中文字幕| 欧美成aaa人片在线观看蜜臀| 亚洲综合第一页| 欧美激情在线视频二区| 91免费看国产| 国产一区二区欧美日韩| 一区二区三区天堂av| 色噜噜久久综合伊人一本| 欧美成人一二三| 欧美一级大片在线免费观看| 国产精品r级在线| 欧美一乱一性一交一视频| 国产一区二区三区在线视频| 91亚洲精品一区| 福利一区视频在线观看| 国产精品色婷婷视频| 尤物九九久久国产精品的分类| 亚洲国产第一页| 日韩av片免费在线观看| 欧美一区二区三区四区在线| 久久久免费精品视频| 91sa在线看| 日韩欧美国产免费播放| 亚洲视频自拍偷拍| 欧美精品日韩三级| 久久久久久久久国产| 中文国产成人精品久久一| 伊人一区二区三区久久精品| 97成人在线视频| 成人精品久久av网站| 国产欧美日韩精品专区|