gpt4 book ai didi

php - 需要一种有选择地杀死休眠的 php 进程的方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:27:38 25 4
gpt4 key购买 nike

我有一个网站,该网站会定期获得大量休眠的 php 进程。我的托管服务设置了 20 个并发运行进程的限制。如果超过限制,我的网站将出现 503 错误。

这种情况很少见,而且似乎与访问我网站的人数没有任何关联。

作为安全措施,我希望有一个带有 php 脚本的 cron 作业,该脚本会杀死已经休眠超过 10 分钟的 php 进程。

我有一个 php 函数可以杀死所有休眠时间超过 10 分钟的 MySql 进程;

  public function kill_sleeping_mysql_processes()
{
$result = $this->db->query("SHOW FULL PROCESSLIST");
foreach($result->result_array() as $row)
{
if ($row['Command'] == "Sleep" && $row['Time'] > 600)
{
$this->db->query("KILL {$row['Id']}")
}
}
}

问题是我怎样才能对 php 进程做同样的事情?

我可以使用这段代码读取 php 进程。

exec("ps aux | less", $output);

如果我有 pid,我可以用这段代码杀死特定的 php 进程;

$pid = 11054;
exec("kill -9 $pid");

但是我怎样才能有选择地杀死休眠时间超过 10 分钟的 php 进程?

最佳答案

我拼凑了一些东西。它不优雅,有点 hack,但它似乎有效,尽管我将在执行 cron 作业之前进一步测试它。

    public function kill_dormant_php_processes()
{
$output_array = array();

exec("ps aux | grep -v grep", $ps_output);

array_shift($ps_output);

if (count($ps_output) > 0)
{
$i = 0;
foreach ($ps_output as $ps)
{
$ps = preg_split('/ +/', $ps);
$output_array[$i]->pid = $ps[1];
$output_array[$i]->stat = $ps[7];
$output_array[$i]->time = $ps[9];
$i++;
}
}

if( ! empty($output_array))
{
foreach ($output_array as $row)
{
if( $row->stat == 'S' && date('H:i', strtotime($row->time)) > date('H:i', strtotime('00:01')))
{
exec("kill -9 $row->pid");
}
}
}
}

我相信一定有更好的方法来做到这一点。

有人可以解释为什么读出的 00:01 似乎翻译成 6 分钟吗?

freedom   6933  6.0  0.1  57040 13040 ?        S    16:55   0:01 /usr/local/bin/php53.cgi -c .:/home/freedom/:/etc index.php

关于php - 需要一种有选择地杀死休眠的 php 进程的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32147903/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com