需要一种有选择地杀死休眠php进程的方法吗
我有一个网站,定期获得大量休眠的php进程。我的托管服务设置了20个并发运行进程的限制。如果超过了限制,我的网站就会出现503错误 这是一种罕见的现象,似乎与访问我的网站的人数没有任何关系 作为一种保护措施,我希望有一个带有php脚本的cron作业,它可以杀死已经休眠超过10分钟的php进程 我有一个php函数,可以杀死所有睡眠超过10分钟的MySql进程需要一种有选择地杀死休眠php进程的方法吗,php,linux,Php,Linux,我有一个网站,定期获得大量休眠的php进程。我的托管服务设置了20个并发运行进程的限制。如果超过了限制,我的网站就会出现503错误 这是一种罕见的现象,似乎与访问我的网站的人数没有任何关系 作为一种保护措施,我希望有一个带有php脚本的cron作业,它可以杀死已经休眠超过10分钟的php进程 我有一个php函数,可以杀死所有睡眠超过10分钟的MySql进程 public function kill_sleeping_mysql_processes() { $result = $
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进程呢?我拼凑了一些东西。它并不优雅,而且有点像黑客,但它似乎可以工作,尽管在投入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
我拼凑了一些东西。它并不优雅,而且有点像黑客,但它似乎可以工作,尽管在投入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脚本的替代方案,您可以使用带有“早于”时间过滤器的
killall
命令(使用-o
选项)来终止所有这些进程
例如,此命令将杀死所有运行超过30分钟的php cgi
进程:
killall -o 30m /usr/bin/php-cgi
作为此处共享的PHP脚本的替代方案,您可以使用带有“早于”时间过滤器的
killall
命令(使用-o
选项)来终止所有这些进程
例如,此命令将杀死所有运行超过30分钟的php cgi
进程:
killall -o 30m /usr/bin/php-cgi
只是好奇你是否检查了日志并试图解决根问题?是的,我试图解决根问题但没有任何效果…我还多次联系了主机的支持人员寻求帮助。几周或几个月都没有问题,然后突然我收到了大量停止运行的脚本,导致我的网站瘫痪。真糟糕。考虑把它写为BASH脚本并用Con调用它。请看:祝你好运。你的PHP配置选项是什么?你能在达到20个限制之前限制工作人员的数量吗?只是好奇你是否检查了日志并试图解决根本问题?是的,我试图解决根本问题,但没有任何效果…我还多次联系我的主机支持寻求帮助。几周或几个月都没有问题,然后突然间我遇到了大量问题让我的网站瘫痪的脚本。真糟糕。考虑把它写为BASH脚本并用Con调用它。请看:祝你好运。你的PHP配置选项是什么?你能在达到20人限制之前限制工人数量吗?