【问题标题】:Get cpu percent usage in php在php中获取cpu百分比使用率
【发布时间】:2012-10-19 07:42:03
【问题描述】:

我想显示 PHP 中的 CPU 使用百分比。如果在 shell 中通过 cron 获取值 > 输出到文件 > 在 PHP 中解析或直接在 php 中获取值,这并不重要。我尝试了许多在互联网上找到的解决方案,但没有任何用处。在平均负载情况下,我无法显示 0-100% 的图形栏,并且我发现的百分比输出功能给我的值不好或只有第一个核心的值。获得每个核心的百分比使用率会很好。有解决办法吗?

编辑:

我做了临时解决方案,效果很好,但不是最好的方法。

cron 作业每隔一分钟运行 php 脚本,该脚本从“顶部”执行 grep cpu 信息的命令并将其保存到文件中,在结束脚本等待 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 的解决方案只是临时解决方案,并不是最好的方法。守护进程会好很多。

【问题讨论】:

标签: debian command-line-interface php


【解决方案1】:

在论坛上搜索并尝试了多种方法后,最准确的是:

$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']

【讨论】:

    【解决方案2】:

    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 核机器上负载平均 [0] 为 0.50,这将显示 25% 的 CPU 负载

    【讨论】:

    • +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

    【讨论】:

    • 是的,我之前看到过这段代码,但有些奇怪。在 ps -aux 中,我的 %CPU 值超过 100
    • @stix 取决于系统有多少 CPU。如果 2 个 CPU 或 2 个核心 CPU - % 将为 200。
    【解决方案4】:

    使用这个:

    <?php
    $loads=sys_getloadavg();
    $core_nums=trim(shell_exec("grep -P '^physical id' /proc/cpuinfo|wc -l"));
    $load=$loads[0]/$core_nums;
    echo $load;
    ?>
    

    【讨论】:

    • 我只想避免执行这么多命令:preg_match_all('/^processor/m', file_get_contents('/proc/cpuinfo'), $matches); $core_nums = count($matches[0]);
    【解决方案5】:

    您可以使用“top -n 1”来获取 cpu 百分比。此命令只运行一次 top ,然后给出输出。我认为您可以自己完成解析部分。

    【讨论】:

      【解决方案6】:

      另一种选择:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-27
        • 2011-10-10
        • 2022-01-26
        • 2015-07-28
        • 1970-01-01
        • 1970-01-01
        • 2020-04-27
        • 1970-01-01
        相关资源
        最近更新 更多