我有一个使用NGINX& PHP-FPM。您可能知道PHP-FPM有一个状态页面,其中包含有关其进程的详细信息。 我的问题是,随着时间的推移,许多进程状态变为“完成”,并且在我重新加载PHP-FPM之前不会改变它们的“完成”状态。
糟糕的是,“完成”流程被视为活动流程,当活动流程数量超过pm.max_children时,我的网站上发生了不好的事情。
我知道一些php-fpm池参数可以杀死空闲进程,但是我找不到参数来杀死一段时间后完成proccesses。
如何处理PHP-FPM整理状态?是否有配置参数在一段时间后终止这些“完成”过程?这可能是NGINX和PHP-FPM之间的错误配置吗? “完成”状态的原因是什么?
这是php-fpm状态的图像。红军正在完成状态,这正是我想要解决的问题。请求URI是我网站的不同页面。
感谢您的了解。
PD1:现在我每15分钟重装一次PHP-FPM并且“修复”或多或少完成状态...但我认为这可能是一个重要的性能问题,流量更多
PD2:到目前为止,我认为可行的唯一解决方案是阅读php-fpm状态页面,获取所有处理完成状态并通过pid杀死proccesses超过任意请求持续时间。< / p>
答案 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