不幸的是,在php fpm/nginx配置上调用php exit()
不会立即停止脚本,而文件句柄可能不会关闭。
一些开发人员建议调用fastcgi_finish_request()
,但这不会停止脚本。
其他人建议将所有代码封装在一个catch块中:
<?php
class SystemExit extends Exception {}
try {
/* PUT ALL THE CODE HERE */
} catch (SystemExit $e) { /* do nothing */ }
?>
并在需要停止代码的地方抛出异常:
if (SOME_EXIT_CONDITION)
throw new SystemExit(); // instead of exit()
这意味着编辑所有php文件以包括try/catch块,这对我来说似乎很乏味
还有其他清洁的解决方案吗?
所以我们发现这是一个register_shutdown_function
回调,它阻止脚本立即退出。
PHP关闭函数被设计为在可能的情况下在任何脚本关闭时调用。但它有一个特性:若其中一个关闭回调调用exit,那个么脚本将退出而不调用任何其他回调。
因此,如果在某些情况下你真的想跳过一个关闭函数,你应该注册一些杀手函数作为第一个关闭回调。在这个杀手函数中,您将检查一种singleton的状态:我们想退出吗?——调用exit()
,否则返回。
<?php
function killer_function() {
if ($someGlobalThing->needToExitRightNow()) {
exit();
}
}
register_shutdown_function('killer_function');
// ...
function exit_now() {
$someGlobalThing->exitNow();
exit();
}
($someGlobalThing
可以是一个单例变量或某个超级全局变量,也可以是全局注册表或任何您喜欢的东西)
那么调用exit_now()
就可以了。