我想在PHP中显示CPU使用百分比。如果通过shell中的cron获取值并不重要>输出到文件>用PHP解析或直接在php中获取值。我尝试在互联网上找到很多解决方案但没有任何用处。对于平均负载,我无法显示0-100%图形条,我找到的百分比输出功能给出了错误的值或只有第一个核心的值。获得每个核心的百分比使用率会很好。有解决方案吗?
编辑:
我做了临时解决方案,它运作良好,但这不是最佳方式。
cron job每隔一分钟运行php脚本,其中exec命令为grep cpu info从“top”保存到文件,在结束脚本上等待3秒并循环20次(每3秒获取更新的方式) php脚本:
<?php
for($i=0; $i<=20; $i++) {
//cpu load
exec("top -b -n 1 | grep 'Cpu(s):' > /some/file.cpu");
//ram usage
exec("top -b -n 1 | grep 'Mem:' > /some/file.ram");
//wait 3sec
sleep(3);
}
?>
现在从这些文件我可以解析信息。
新问题是如何使守护程序脚本每3秒运行一次此命令。我认为使用php脚本和cron的解决方案只是暂时的解决方案,并不是最好的方法。守护进程会好得多。
答案 0 :(得分:15)
在论坛上搜索并尝试了很多方法后,最准确的是:
$stat1 = file('/proc/stat');
sleep(1);
$stat2 = file('/proc/stat');
$info1 = explode(" ", preg_replace("!cpu +!", "", $stat1[0]));
$info2 = explode(" ", preg_replace("!cpu +!", "", $stat2[0]));
$dif = array();
$dif['user'] = $info2[0] - $info1[0];
$dif['nice'] = $info2[1] - $info1[1];
$dif['sys'] = $info2[2] - $info1[2];
$dif['idle'] = $info2[3] - $info1[3];
$total = array_sum($dif);
$cpu = array();
foreach($dif as $x=>$y) $cpu[$x] = round($y / $total * 100, 1);
现在统计数据在$ cpu ['user'],$ cpu ['nice'],$ cpu ['sys'],$ cpu ['idle']
答案 1 :(得分:3)
我对你的要求并不是100%肯定,但如果我是对的,这个答案可能对你有所帮助:
<?php
exec('ps -aux', $processes);
foreach($processes as $process)
{
$cols = split(' ', ereg_replace(' +', ' ', $process));
if (strpos($cols[2], '.') > -1)
{
$cpuUsage += floatval($cols[2]);
}
}
print($cpuUsage);
?>
提供的代码是Devils Child对类似问题的回答: https://stackoverflow.com/a/9846219/904242
答案 2 :(得分:2)
使用此:
<?php
$loads=sys_getloadavg();
$core_nums=trim(shell_exec("grep -P '^physical id' /proc/cpuinfo|wc -l"));
$load=$loads[0]/$core_nums;
echo $load;
?>
答案 3 :(得分:1)
您可以使用“top -n 1”获取cpu百分比。此命令只运行一次top,然后给出输出。我认为你可以自己做解析部分。
答案 4 :(得分:1)
Diyism的答案以及对http://php.net/manual/en/function.sys-getloadavg.php的建议似乎并不适用于CentOS 6.5 VPS。我们必须将physical id
更改为processor
。然后它返回一个核心作为ID 0,因此计算需要+1核心。此外,您需要乘以100才能获得百分位数。最后,需要四舍五入才能获得漂亮的百分比。所以这里有一个替代的想法,如果碰到其中任何一个可能会有效:
<?php
$loads = sys_getloadavg();
$core_nums = trim(shell_exec("grep -P '^processor' /proc/cpuinfo|wc -l"));
$load = round($loads[0]/($core_nums + 1)*100, 2);
echo $load;
?>
因此,如果2核心机器上的负载avg [0]为0.50,则显示CPU负载为25%
答案 5 :(得分:0)
还有一个选择:
function cpuload() {
$cont = file('/proc/stat');
$cpuloadtmp = explode(' ',$cont[0]);
$cpuload0[0] = $cpuloadtmp[2] + $cpuloadtmp[4];
$cpuload0[1] = $cpuloadtmp[2] + $cpuloadtmp[4]+ $cpuloadtmp[5];
sleep(1);
$cont = file('/proc/stat');
$cpuloadtmp = explode(' ',$cont[0]);
$cpuload1[0] = $cpuloadtmp[2] + $cpuloadtmp[4];
$cpuload1[1] = $cpuloadtmp[2] + $cpuloadtmp[4]+ $cpuloadtmp[5];
return ($cpuload1[0] - $cpuload0[0])*100/($cpuload1[1] - $cpuload0[1]);
}