PHP - exit and shutdown function
缘由
下午看业务代码的时候发现系统在输出json
格式的数据的时候,使用了exit
:
在exit
之前,有一个记录日志的方法log_monitor
,根据之前看的这套框架,系统的日志代码最终的save
方法是注册在register_shutdown_function
里面的,即程序退出时执行.
那么这个日志会不会上报上去呢?
Find out
俗话说,外事不决问狗狗.但是,PHP的问题呢,我们看manual
就足够了.
打开关于exit
的页面,一句话赫然入目:
Terminates execution of the script. Shutdown functions and
object destructors will always be executed even if exit is called.
A-ao,原来exit
是会调用注册的shutdown functions
的,同时呢,也会调用各种对象的__destruct
方法.
其实,exit
就是一个平滑的退出过程吧,register_shutdown_function
里面有一个Note:
Shutdown functions will not be executed if the process
is killed with a SIGTERM or SIGKILL signal. While you cannot
intercept a SIGKILL, you can use pcntl_signal() to install
a handler for a SIGTERM which uses exit() to end cleanly.
大概意思是,当你使用信号SIGKILL和SIGTERM进行关闭的时候,注册的shutdown function不会被执行,当然SIGTERM可以用可以使用信号绑定到exit上面进行平滑的关闭.
其他想法
Manual上面一般都是关于正常情况的讨论,那么异常情况呢?
比如出现了Fatal Error呢?
于是有了下面这个栗子:
显然,上面的栗子中baz()
这个函数是不存在的,那么这一行就会出现Fatal Error.
这种情况下,其实shutdown function也生效了,是不是很惊讶. ToT