php教程,如何理解register_shutdown_function()函数?
发布于 作者:苏南大叔 来源:程序如此灵动~本文的主角是:register_shutdown_function()
函数。在网上的教程里面,它是作为set_error_handler()
或者set_exception_handler()
的类似存在。可以用于捕获一些漏网的错误信息。但是,它真的就是做这个用途的么?
苏南大叔的“程序如此灵动”博客,记录苏南大叔的编程经验总结。本文测试环境:win10
,nginx@1.15.11
,php@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) "大叔"
}
然而好像也没有啥用...
最后一个例子
可以注册多个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退出"); // 方式二
相关文章
- https://newsn.net/say/php-set_error_handler.html
- https://newsn.net/say/php-set_error_handler-2.html
- https://newsn.net/say/php-set_error_handler-3.html
- https://newsn.net/say/php-set_exception_handler.html
- https://newsn.net/say/php-set_exception_handler-2.html
- https://newsn.net/say/php-error-exception.html
结束语
发挥点想象力,这个register_shutdown_function()
作为最后的守门员,是一定的存在价值的。更多文章,请点击:
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。