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

时间:2015-11-27 10:35:48

标签: php 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块,对我来说似乎很乏味。

还有其他干净的解决方案吗?

1 个答案:

答案 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()就可以了。