如何停止php脚本在php fpm/nginx上的执行


How to stop php script execution on php-fpm/nginx?

不幸的是,在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()就可以了。