sti*_*tix 12 php debian command-line-interface
我想在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);
}
?>
Run Code Online (Sandbox Code Playgroud)
现在从这个文件我可以解析信息.
新问题是如何让守护进程脚本每3秒运行一次这个命令.我认为使用php脚本和cron的解决方案只是暂时的解决方案,并不是最好的方法.守护进程会好得多.
sti*_*tix 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);
Run Code Online (Sandbox Code Playgroud)
现在统计数据在$ cpu ['user'],$ cpu ['nice'],$ cpu ['sys'],$ cpu ['idle']
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;
?>
Run Code Online (Sandbox Code Playgroud)
因此,如果负载 avg [0] 在 2 核机器上为 0.50,这将显示 25% 的 CPU 负载