Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I get the PHP-FPM process to terminate when a user aborts request? (Nginx)

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)

like image 545
velo9 Avatar asked May 08 '12 05:05

velo9


Video Answer


3 Answers

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
like image 105
Willem Avatar answered Oct 10 '22 00:10

Willem


You have to check your nginx config, 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).

like image 31
Kamafeather Avatar answered Oct 09 '22 23:10

Kamafeather


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.

like image 1
YAAK Avatar answered Oct 09 '22 23:10

YAAK