5

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

<?php

sleep(30);
trigger_error('Still happened?');

?>

如何为 PHP-FPM 进行用户中止?(如果可能的话)

4

3 回答 3

2

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

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

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

在紧急情况下,您可以杀死所有连接断开的 php-fpm 进程。假设您在 localhost:9000 上监听 php-fpm,这将起作用:

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
于 2014-08-11T20:28:35.343 回答
2

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

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

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

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

于 2015-01-27T11:00:33.283 回答
1

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

根据 PHP 手册:连接处理

要设置此行为,请使用ignore_user_abort

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

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

在第二种情况下,您可能还想set_time_limit根据您的需要使用给您的脚本足够的时间来完成任务。

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

于 2012-10-16T17:48:01.807 回答