12

PHP で CPU 使用率を表示したいと考えています。シェルでcronで値を取得する>ファイルに出力する>PHPで解析するか、phpで直接値を取得する場合は重要ではありません。インターネットで見つけた多くのソリューションを試しましたが、何も役に立ちませんでした。負荷平均を使用すると、0 ~ 100% のグラフィック バーを表示できず、パーセンテージ出力で見つかった関数が悪い値を返すか、最初のコアの値のみを返します。すべてのコアの使用率を取得するとよいでしょう。これに対する解決策はありますか?

編集:

一時的な解決策を作成します。うまく機能しますが、最善の方法ではありません。

1分ごとにcronジョブを実行し、「トップ」からgrep cpu infoのコマンドを実行するphpスクリプトを実行してファイルに保存し、終了スクリプトで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による解決策は一時的な解決策であり、最善の方法ではないと思います。デーモンははるかに優れています。

4

6 に答える 6

18

フォーラムを検索して多くの方法を試した後、最も正確なのは次のとおりです。

$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'] にあります

于 2012-10-31T09:39:09.877 に答える
6

Diyism による回答とhttp://php.net/manual/en/function.sys-getloadavg.phpの提案は、CentOS 6.5 VPS では機能しないようです。に変更physical idする必要がありましたprocessor。次に、1 つのコアを 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 コアのマシンで load avg [0] が 0.50 の場合、CPU 負荷は 25% と表示されます。

于 2014-10-24T15:44:10.187 に答える
4

あなたが何を求めているのか 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

于 2012-10-30T06:01:11.480 に答える
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;
?>
于 2014-05-28T10:36:19.710 に答える
1

CPUパーセンテージを取得するには、「top -n 1」を使用できます。このコマンドは top を 1 回だけ実行し、出力を返します。解析部分は自分でできると思います。

于 2012-10-31T06:35:38.517 に答える