不幸的是,在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块,对我来说似乎很乏味。
还有其他干净的解决方案吗?
答案 0 :(得分:0)
因此我们发现它是一个register_shutdown_function
回调,可以阻止您的脚本立即退出。
PHP关闭函数旨在尽可能在任何脚本关闭时调用。但它有一个特性:如果其中一个关闭回调调用exit - 脚本退出而不调用任何其他回调。
因此,如果你真的想在某些情况下跳过关闭函数,你应该注册一些杀手函数作为第一个关闭回调函数。在杀手功能里面你会检查一种状态的单身人士:我们想退出吗? - 致电exit()
,否则 - 回复。
<?php
function killer_function() {
if ($someGlobalThing->needToExitRightNow()) {
exit();
}
}
register_shutdown_function('killer_function');
// ...
function exit_now() {
$someGlobalThing->exitNow();
exit();
}
($someGlobalThing
可以是单例或某些超全局变量或全局注册表或任何您喜欢的内容)
然后调用exit_now()
就可以了。