怎么在PHP中使用register_shutdown_function函数
创始人
2024-12-08 02:21:51
0次

1. 函数说明

定义:该函数是来注册一个会在PHP中止时执行的函数

参数说明:

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

注册一个 callback ,它会在脚本执行完成或者 exit() 后被调用。

callback:待注册的中止回调

parameter:可以通过传入额外的参数来将参数传给中止函数

2. PHP中止的情况

PHP中止的情况有三种:

  • 执行完成

  • exit/die导致的中止

  • 发生致命错误中止

a. 第一种情况,执行完成

运行:

before 
这个是中止方法test的输出

注意:输出的顺序,等执行完成了之后才会去执行register_shutdown_function的中止方法test

b. 第二种情况,exit/die导致的中止

运行:

before 
这个是中止方法test的输出

后面的after并没有输出,即exit或者是die方法导致提前中止。

c. 第三种情况,发送致命错误中止

运行:

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. 参数

第一个参数支持以数组的形式来调用类中的方法,第二个以及后面的参数都是可以当做额外的参数传给中止方法。

也可以在类中执行:

f():" . $str; 
 } 
} 
 
$demo = new TestDemo(); 
echo 'before' . PHP_EOL; 
 
/** 
运行: 
before 
class TestDemo->f():hello 
 */

4. 同时调用多个

可以多次调用 register_shutdown_function,这些被注册的回调会按照他们注册时的顺序被依次调用。

不过注意的是,如果在第一个注册的中止方法里面调用exit方法或者是die方法的话,那么其他注册的中止回调也不会被调用。
代码:

f():" . $str; 
 } 
} 
 
$demo = new TestDemo(); 
echo 'before' . PHP_EOL; 
 
/** 
运行: 
before 
hello 
class TestDemo->f():hello 
 
注意:如果f方法里面调用了exit或者是die的话,那么最后的class TestDemo->f():hello不会输出 
 */

5. 用处

该函数的作用:

析构函数:在PHP4的时候,由于类不支持析构函数,所以这个函数经常用来模拟实现析构函数

致命错误的处理:使用该函数可以用来捕获致命错误并且在发生致命错误后恢复流程处理

代码如下:

运行:

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)来捕获致命错误,代码如下:

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范例参考与解析:

                
            

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...