我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

本文的主角是:register_shutdown_function()函数。在网上的教程里面,它是作为set_error_handler()或者set_exception_handler()的类似存在。可以用于捕获一些漏网的错误信息。但是,它真的就是做这个用途的么?

苏南大叔:php教程,如何理解register_shutdown_function()函数? - 代码执行完毕事件
php教程,如何理解register_shutdown_function()函数?(图2-1)

苏南大叔的“程序如此灵动”博客,记录苏南大叔的编程经验总结。本文测试环境:win10nginx@1.15.11php@8.2.10-nts

前文回顾

在很多年前,苏南大叔写过一篇文章,叫做《php错误error、exception处理之终极版》,链接如下:

除了set_error_handler()或者set_exception_handler()外,还使用了register_shutdown_function()来捕获可能漏网的错误异常。然而,很多年后,来看相关代码的话。

register_shutdown_function(function () {
    define('E_FATAL', E_ERROR | E_USER_ERROR | E_CORE_ERROR |
        E_COMPILE_ERROR | E_RECOVERABLE_ERROR | E_PARSE);
    $error = error_get_last();
    if ($error && ($error["type"] === ($error["type"] & E_FATAL))) {
        $errno = $error["type"];
        $errfile = $error["file"];
        $errline = $error["line"];
        $errstr = $error["message"];
        // error_handler($errno, $errstr, $errfile, $errline);
    }
});

其实,register_shutdown_function()就是注册一个页面执行完毕后的一个自动执行的钩子。没有必要非要定性为"获得错误信息"的功用。只是下面这句话,把它定性为错误处理程序的。

$error = error_get_last();

register_shutdown_function()

register_shutdown_function()的函数原型是:

register_shutdown_function(callable $callback, mixed ...$args): void

注册一个 callback ,它会在脚本执行完成或者 exit() 后被调用。可以多次调用 register_shutdown_function(),这些被注册的回调会按照他们注册时的顺序被依次调用。如果你在注册的方法内部调用 exit(),那么所有处理会被中止,并且其他注册的中止回调也不会再被调用。
关闭函数也可以调用 register_shutdown_function() 来将关闭函数添加到队列的末尾。

第一个参数callback

callback,回调函数还是比较好理解的。待注册的中止回调。中止回调是作为请求的一部分被执行的,因此可以在它们中进行输出或者读取输出缓冲区。

做个匿名函数就行:

register_shutdown_function(function() {
    echo "代码执行完了",PHP_EOL;
});

或者调用某个类下面的静态方法:

register_shutdown_function(["SN","shutdownEvent"]);

第二个参数args

args,可以通过传入额外的参数来将参数传给中止函数。测试代码:

register_shutdown_function(function ($args) {
    echo "代码执行完了",PHP_EOL;
    var_dump(func_get_args());
    var_dump($args);
    // $error = error_get_last();
    // var_dump($error);
},["苏南","大叔"]);
// $sn = new SN();

输出:

代码执行完了
array(1) {
  [0]=>
  array(2) {
    [0]=>
    string(6) "苏南"
    [1]=>
    string(6) "大叔"
  }
}
array(2) {
  [0]=>
  string(6) "苏南"
  [1]=>
  string(6) "大叔"
}

苏南大叔:php教程,如何理解register_shutdown_function()函数? - 可以传递args更多信息
php教程,如何理解register_shutdown_function()函数?(图2-2)

然而好像也没有啥用...

最后一个例子

可以注册多个register_shutdown_function(),会按照函数注册顺序的先后被执行。register_shutdown_function()触发的条件是:

  • exit()
  • die()
  • 发生异常exception
  • 代码正常执行完毕。

需要注意的是:register_shutdown_function()需要注册在die()或者exit()等之前,才会被正确执行。

register_shutdown_function(function ($args) {
    echo "第一个shutdown",PHP_EOL;
},["苏南","大叔"]);
register_shutdown_function(function() {
    echo "第二个shutdown",PHP_EOL;
});
echo "准备exit",PHP_EOL;

exit("exit退出"); // 方式一
die("die退出");   // 方式二

相关文章

结束语

发挥点想象力,这个register_shutdown_function()作为最后的守门员,是一定的存在价值的。更多文章,请点击:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   php