I know Nginx has nothing to do with the PHP-FPM process, but I would much prefer if the PHP-FPM process died if a user aborts so it doesn't continue doing needless things or wasting resources. For PHP-FPM/Nginx the trigger_error will happen regardless of user abort:
<?php
sleep(30);
trigger_error('Still happened?');
?>
How can I do user aborts for PHP-FPM? (if possible)
This is not implemented by php-fpm, more info here.
Setting ignore_user_abort(FALSE) only works when PHP sends data over the socket, not when it is busy calculating a response.
Ideally, it should be implemented in php-fpm, but I don't think it will be very easy, given that PHP is mostly single threaded.
In emergency situations, you could kill all php-fpm processes with a broken connection. Assuming you have php-fpm listening on localhost:9000, this would work:
netstat -ntp | grep 127.0.0.1:9000 | grep php-fpm | grep CLOSE_WAIT |\
awk ' { print $7; } ' | cut -d/ -f1 | while read pid; do
echo "Killing php-fpm/$pid because client has closed connection"
kill $pid
done
You have to check your
nginxconfig, before trying to set the behaviour on the PHP script.
The settings linked by @YAAK don't always work with nginx. In my actual case it is not possible to stop the script, regardless what you do on PHP side.
Playing on the nginx fastcgi parameter fastcgi_ignore_client_abort (default set to off) could help.
Additionally, a manual solution (just for development environment) is to execute (on Linux): sudo service php-fpm restart, so that the worker process running the script will be killed (beware: this will kill all the workers or other running services).
You can decide whether or not you want a client disconnect to cause your script to be aborted.
According to PHP Manual : Connection Handling
To set this behavior use ignore_user_abort
ignore_user_abort(FALSE); will abort running of PHP script after client disconnect.
ignore_user_abort(TRUE); will ignore the client disconnect and continues to run the script.
In the second case, you may also want to use set_time_limit based on your needs to give your script enough time to accomplish the task.
This setting has been tested in a PHP-FPM/nginx environment successfully.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With