如何让 PHP-FPM 进程在用户中止请求时终止?(咕噜咕噜)


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

我知道Nginx与PHP-FPM进程

无关,但是如果用户中止,我更希望PHP-FPM进程死亡,这样它就不会继续做不必要的事情或浪费资源。对于 PHP-FPM/Nginx,无论用户中止如何,都会发生trigger_error

<?php
sleep(30);
trigger_error('Still happened?');
?>

如何为 PHP-FPM 执行用户中止操作?(如果可能)

这不是由php-fpm实现的,更多信息在这里。

设置ignore_user_abort(FALSE)仅在 PHP 通过套接字发送数据时才有效,而不是在它忙于计算响应时有效。

理想情况下,它应该在php-fpm中实现,但我认为这并不容易,因为PHP主要是单线程的。

在紧急情况下,您可以在连接断开的情况下终止所有 php-fpm 进程。假设你有php-fpm监听本地主机:9000,这将工作:

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

尝试在 PHP 脚本上设置行为之前,您必须检查您的nginx配置。

@YAAK链接的设置并不总是适用于nginx。在我的实际情况下,无论您在 PHP 端做什么,都无法停止脚本。

nginx fastcgi参数fastcgi_ignore_client_abort(默认设置为off)上播放可能会有所帮助。

此外,手动解决方案(仅适用于开发环境)是执行(在 Linux 上):sudo service php-fpm restart ,以便运行脚本的工作进程将被终止(请注意:这将杀死所有工作线程或其他正在运行的服务)。

您可以决定是否希望客户端断开连接导致 要中止的脚本。

根据 PHP 手册:连接处理

若要设置此行为,请使用ignore_user_abort

ignore_user_abort(FALSE);将在客户端断开连接后中止 PHP 脚本的运行。

ignore_user_abort(TRUE);将忽略客户端断开连接并继续运行脚本。

在第二种情况下,您可能还希望根据需要使用set_time_limit,以便为脚本提供足够的时间来完成任务。

此设置已在PHP-FPM/nginx环境中成功测试。