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

标签 php linux

我有一个网站,该网站会定期获得大量休眠的 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/

相关文章:

linux - 如何重置所有环境变量?

linux - 在 bash 函数中,如何将 stdin 放入变量中

javascript - 将值从 javascript 发布到 php 并在 php 中添加这些值

PHP foreach,查询中使用的数组数据

javascript - 检查不同服务器上的文件

java - 如何在Java中以sudo权限执行bash命令?

javascript - 通过 AJAX 调用在 div 中显示 JS 数组

javascript - Uncaught ReferenceError : $data is not defined

python - 无法在 Vagrant 中使用 Virtualenv 导入模块

c - 为什么在 select 中使用 writefds ?如何在实践中使用它们?