简体   繁体   中英

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

Unfortunately calling php exit() on php-fpm/nginx configuration does not stop the script immediately while file handles might not be closed.

Some developers suggest calling fastcgi_finish_request() but also this does not stop the script.

Others suggest wrapping all code in a catch block:

<?php
    class SystemExit extends Exception {}
    try {
       /* PUT ALL THE CODE HERE */
    } catch (SystemExit $e) { /* do nothing */ }
?>

and throwing an exception where code stop is needed:

if (SOME_EXIT_CONDITION)
   throw new SystemExit(); // instead of exit()

This would mean editing all php files to include try/catch block and seems tedious to me.

Are there any other clean solutions?

So we found out that it's a register_shutdown_function callback that prevents your script from exiting immediately.

PHP shutdown function is designed to be called on any script shutdown when possible. But it has a feature: if one of shutdown callbacks calls exit — script is exiting without calling any other callbacks.

So if you really want to skip a shutdown function in some cases, you should register some killer-function as a very first shutdown callback. Inside that killer-function you will check a kind of singleton for state: do we want to exit? — call exit() , otherwise — return.

<?php

function killer_function() {
    if ($someGlobalThing->needToExitRightNow()) {
        exit();
    }
}

register_shutdown_function('killer_function');

// ...

function exit_now() {
    $someGlobalThing->exitNow();
    exit();
}

( $someGlobalThing can be a singleton or some super-global variable or a global registry or whatever you like)

Then calling exit_now() will do the trick.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM