38

サーバー (Linux ディストリビューション) で使用可能な RAM を PHP (Linux コマンドを使用して widthout) で知る方法はありますか?

編集:申し訳ありませんが、目的は、特定のサーバーのサーバー/仮想マシンで使用可能なRAMを認識することです(そのメモリが共有されている場合でも)。

4

9 に答える 9

44

このコードが Linux でのみ実行されることがわかっている場合は、特殊/proc/meminfoファイルを使用して、システムの仮想メモリ サブシステムに関する情報を取得できます。ファイルの形式は次のとおりです。

MemTotal:       255908 kB
MemFree:         69936 kB
Buffers:         15812 kB
Cached:         115124 kB
SwapCached:          0 kB
Active:          92700 kB
Inactive:        63792 kB
...

その最初の行 にMemTotal: ...は、マシン内の物理 RAM の量から、カーネルが独自に使用するために予約したスペースを差し引いたものが含まれています。これは、Linux システムで使用可能なメモリの簡単なレポートを取得するための、私が知っている最良の方法です。次のコードのようなもので抽出できるはずです。

<?php
  $fh = fopen('/proc/meminfo','r');
  $mem = 0;
  while ($line = fgets($fh)) {
    $pieces = array();
    if (preg_match('/^MemTotal:\s+(\d+)\skB$/', $line, $pieces)) {
      $mem = $pieces[1];
      break;
    }
  }
  fclose($fh);

  echo "$mem kB RAM found"; ?>

(注: このコードは、環境に合わせて微調整する必要がある場合があります。)

于 2009-09-21T16:37:47.963 に答える
39

すべてを配列に使用/proc/meminfoして取得するのは簡単です。

<?php

function getSystemMemInfo() 
{       
    $data = explode("\n", file_get_contents("/proc/meminfo"));
    $meminfo = array();
    foreach ($data as $line) {
        list($key, $val) = explode(":", $line);
        $meminfo[$key] = trim($val);
    }
    return $meminfo;
}

?>

var_dump( getSystemMemInfo() );

array(43) {
  ["MemTotal"]=>
  string(10) "2060700 kB"
  ["MemFree"]=>
  string(9) "277344 kB"
  ["Buffers"]=>
  string(8) "92200 kB"
  ["Cached"]=>
  string(9) "650544 kB"
  ["SwapCached"]=>
  string(8) "73592 kB"
  ["Active"]=>
  string(9) "995988 kB"
  ...
于 2009-09-21T17:04:57.770 に答える
6

Linux コマンドは、PHPのexec関数を使用して実行できます。これは効率的であり、仕事をします(目的がメモリを取得することである場合)。

次のコードを試してください。

<?php
  exec("free -mtl", $output);
  print_r($output);
?>
于 2013-11-22T11:52:03.417 に答える
1

Windows では、シェル コマンド systeminfo の出力を実行して解析することで、この情報 (およびその他の情報) を取得できることに注意してください。

于 2014-05-31T06:25:35.340 に答える
-1

私はそのような関数を見たことがないのを覚えていません-実際には、PHPが何のために作られているのかという範囲外です。

そのような機能があったとしても、おそらく基盤となるオペレーティングシステムに固有の方法で実装され、LinuxとWindowsの両方で機能しない可能性がありますsys_getloadavgそのようなものの例については、を参照してください)。

于 2009-09-21T16:23:26.497 に答える