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

时间:2015-08-21 19:22:20

标签: 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进程?

2 个答案:

答案 0 :(得分:0)

我拼凑了一些东西。它不优雅,有点像黑客但似乎有用,虽然我会在进入cron工作之前进一步测试它。

private void btnSaveActionPerformed(java.awt.event.ActionEvent evt) {
    row = table.getSelectedRow();
    int column = table.getColumnCount();

    try {
        Conn();
        System.out.print(table.getValueAt(row,0));
        pStmt = conn.prepareStatement("update customer_tbl set LName = '" + txtLname.getText() + "', FName= '" 
            + txtFname.getText() + "', Address = '" + txtAddress.getText() + "', ContactNumber = '"+txtContact.getText() 
            + "', Age = '" + txtAge+"' WHERE Name_ID = '" + table.getValueAt(row,0) + "'");

        //  st = conn.createStatement();
        // rs = st.executeQuery("UPDATE customer_tbl SET Fname = '"+txtFname.getText()+"' Lname= '"+txtLname.getText()+"', Age = '"+txtAge.getText()+"', Address = '"+txtAddress.getText()+"', ContactNumber = '"+txtContact+"' WHERE Customer_id = '"+ table.getValueAt(row,0)+"'");
        pStmt.executeUpdate();

        JOptionPane.showMessageDialog(null,"Update success !");

        //FillList();
    }

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

有人可以解释为什么读出时00:01似乎转化为6分钟?

    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");
                }
            }
        }
    }

答案 1 :(得分:0)

作为此处共享的PHP脚本的替代方法,您可以将killall命令与“早于”时间过滤器一起使用(使用-o选项)以杀死所有这些进程。

例如,此命令将杀死所有运行了30分钟以上的php-cgi进程:

killall -o 30m /usr/bin/php-cgi