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()
就是注册一个页面执行完毕后的一个自动执行的钩子。没有必要非要定性为"获得错误信息"的功用。只是下面这句话,把它定性为错误处理程序的。
register_shutdown_function()
register_shutdown_function()
的函数原型是:
注册一个 callback ,它会在脚本执行完成或者 exit() 后被调用。可以多次调用 register_shutdown_function(),这些被注册的回调会按照他们注册时的顺序被依次调用。如果你在注册的方法内部调用 exit(),那么所有处理会被中止,并且其他注册的中止回调也不会再被调用。
关闭函数也可以调用 register_shutdown_function() 来将关闭函数添加到队列的末尾。
第一个参数callback
callback
,回调函数还是比较好理解的。待注册的中止回调。中止回调是作为请求的一部分被执行的,因此可以在它们中进行输出或者读取输出缓冲区。
做个匿名函数就行:
或者调用某个类下面的静态方法:
第二个参数args
args
,可以通过传入额外的参数来将参数传给中止函数。测试代码:
输出:

然而好像也没有啥用...
最后一个例子
可以注册多个register_shutdown_function()
,会按照函数注册顺序的先后被执行。register_shutdown_function()
触发的条件是:
exit()
。die()
。- 发生异常
exception
。 - 代码正常执行完毕。
需要注意的是:register_shutdown_function()
需要注册在die()
或者exit()
等之前,才会被正确执行。
相关文章
- 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()
作为最后的守门员,是一定的存在价值的。更多文章,请点击:


