2015-08-21 53 views
1

我有一個網站,定期獲取大量的睡眠php進程。我的託管服務設置了20個併發運行進程的限制。如果超過限制,我的網站就會出現503錯誤。需要一種方法來選擇性地殺死睡眠php進程

這很少見,似乎與訪問我的網站的人數沒有任何關聯。

作爲一個安全措施,我希望有一個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); 

我可以用這段代碼殺死特定的php進程,如果我有pid;

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

但是我該如何選擇性地殺死已經睡眠超過10分鐘的php進程呢?

+0

只是好奇,如果你已經檢查你的日誌,並試圖解決根本問題? – ficuscr

+0

是的,我試圖解決根本問題無濟於事......我也多次聯繫我的主持人的支持尋求幫助。 –

+0

它幾個星期或幾個月沒有問題,然後突然之間我得到了一系列停滯腳本,使我的網站下降。 –

回答

0

我拼湊了一些東西在一起。雖然我在進行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