当用户中止请求时,如何让PHP-FPM进程终止? (Nginx的)

时间:2012-05-08 05:23:14

标签: nginx request abort php

我知道Nginx与PHP-FPM进程无关,但我更倾向于如果用户中止,PHP-FPM进程就会死机,因此它不会继续做不必要的事情或浪费资源。对于PHP-FPM / Nginx,trigger_error将发生,无论用户是否中止:

<?php

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

?>

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

3 个答案:

答案 0 :(得分:2)

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

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

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

在紧急情况下,您可以使用断开的连接终止所有php-fpm进程。假设你有一个php-fpm监听localhost: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

答案 1 :(得分:1)

  

您可以决定是否要让客户端断开连接   你的脚本将被中止。

根据PHP手册:Connection Handling

要设置此行为,请使用ignore_user_abort

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

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

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

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

答案 2 :(得分:1)

  

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

@YAAK链接的设置始终nginx一起使用。在我的实际情况中,无论你在PHP方面做什么,都无法停止脚本。

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

此外,手动解决方案(仅适用于开发环境)将执行(在 Linux 上):sudo service php5-fpm restart,以便阻止脚本。