如何处理PHP-FPM整理状态?

时间:2013-11-12 14:55:58

标签: nginx php

我有一个使用NGINX& PHP-FPM。您可能知道PHP-FPM有一个状态页面,其中包含有关其进程的详细信息。 我的问题是,随着时间的推移,许多进程状态变为“完成”,并且在我重新加载PHP-FPM之前不会改变它们的“完成”状态。

糟糕的是,“完成”流程被视为活动流程,当活动流程数量超过pm.max_children时,我的网站上发生了不好的事情。

我知道一些php-fpm池参数可以杀死空闲进程,但是我找不到参数来杀死一段时间后完成proccesses。

如何处理PHP-FPM整理状态?是否有配置参数在一段时间后终止这些“完成”过程?这可能是NGINX和PHP-FPM之间的错误配置吗? “完成”状态的原因是什么?

这是php-fpm状态的图像。红军正在完成状态,这正是我想要解决的问题。请求URI是我网站的不同页面。

enter image description here

感谢您的了解。

PD1:现在我每15分钟重装一次PHP-FPM并且“修复”或多或少完成状态...但我认为这可能是一个重要的性能问题,流量更多

PD2:到目前为止,我认为可行的唯一解决方案是阅读php-fpm状态页面,获取所有处理完成状态并通过pid杀死proccesses超过任意请求持续时间。< / p>

4 个答案:

答案 0 :(得分:0)

有同样的问题。这是我用作临时解决方案的内容:

创建一个包含以下内容的PHP文件:

<?php
fastcgi_finish_request();
?>

编辑php.ini:

auto_append_file = /path/to/your/file.php

答案 1 :(得分:0)

我有这样的问题,这是我的修复:

  

事实证明我们确实使用了无效的Memcached密钥   的情况。这导致Memcached死亡而没有错误   PHP进程保持活跃。

https://serverfault.com/questions/626904/php-fpm-state-finishing-but-never-completes

答案 2 :(得分:0)

这两个评论都没有解决或解释问题背后的根本原因。执行PD2方法以杀死这些过程的示例代码应该是这样的:

<?php

while (true) {
    $data_json = file_get_contents("http://localhost/fpmstatus?json&full");
    $data = json_decode($data_json, true);

    foreach ($data['processes'] as $proc) {
            if ($proc['state'] === "Finishing") {
                    $pid = $proc['pid'];
                    $duration = $proc['request duration'] / 1000000.0;
                    echo json_encode(compact("pid", "duration"));
                    if ($duration > 60) {
                            passthru("kill -9 " . $pid);
                            echo " KILLED\n";
                    } else {
                            echo "\n";
                    }
            }
    }
    echo count($data['processes']);
    echo "\n";
    sleep(30);
}

运行此代码时,我确实发现error.log中会出现这样的错误:

  

2017/08/06 13:46:42 [错误] 20#20:* 9161 recv()失败(104:对等连接重置)从上游读取响应头,客户端:77.88.5.19,服务器:hostname1 ,请求:“GET /?p = 9247 HTTP / 1.1”,上游:“fastcgi:// uni   x:/run/php/php7.0-fpm.sock:“,host:”hostname2“

明显的不匹配是请求由“hostname1”的块处理,而“hostname2”的块不再存在(不再)。我不能肯定地说这是原因。即使在声明server_name _;块之后,仍有“完成”请求,但它们的频率低于之前发生的任何事件。

答案 3 :(得分:0)

我的服务器在apache代理配置中设置了enablereuse = on。删除它修复了“整理”问题。

还在问题中列出:https://serverfault.com/questions/626904/php-fpm-state-finishing-but-never-completes