代码之家  ›  专栏  ›  技术社区  ›  yoda

使用php获取服务器ram

  •  29
  • yoda  · 技术社区  · 15 年前

    有没有一种方法可以通过php(widthout使用linux命令)了解服务器(linux发行版)中可用的ram?

    编辑:抱歉,目标是了解服务器/虚拟机中特定服务器的可用ram(即使该内存是共享的)。

    8 回复  |  直到 15 年前
        1
  •  41
  •   ddjikic    10 年前

    如果您知道此代码将仅在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"; ?>
    

        2
  •  37
  •   Hassaan    6 年前

    使用 /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"
      ...
    
        3
  •  6
  •   fotuzlab    11 年前

    Linux命令可以使用 exec

    请尝试以下代码:

    <?php
      exec("free -mtl", $output);
      print_r($output);
    ?>
    
        4
  •  3
  •   Mahdyfo Artefacto    5 年前

    小而整洁的函数,用于获取与其键关联的所有值。

    $contents = file_get_contents('/proc/meminfo');
    preg_match_all('/(\w+):\s+(\d+)\s/', $contents, $matches);
    $info = array_combine($matches[1], $matches[2]);
    
    // $info['MemTotal'] = "2047442"
    
        5
  •  1
  •   xendi    10 年前

    值得注意的是,在Windows中,可以通过执行和解析shell命令systeminfo的输出来获取这些信息(以及更多信息)

        6
  •  1
  •   Eugen Mihailescu    8 年前

    我认为,如果没有一个特殊的PHP扩展名,就无法访问主机服务器内存信息。PHP核心库不允许(可能出于安全原因)访问扩展内存信息。

    但是,如果您的脚本可以访问 /proc/meminfo 然后,您可以查询该特殊文件并获取所需信息。在Windows上(尽管您没有要求),我们可以使用 com_dotnet PHP扩展,用于通过COM查询Windows框架。

    下面你可以找到我的 getSystemMemoryInfo wmiWBemLocatorQuery 只是一个辅助函数。

    function wmiWBemLocatorQuery( $query ) {
        if ( class_exists( '\\COM' ) ) {
            try {
                $WbemLocator = new \COM( "WbemScripting.SWbemLocator" );
                $WbemServices = $WbemLocator->ConnectServer( '127.0.0.1', 'root\CIMV2' );
                $WbemServices->Security_->ImpersonationLevel = 3;
                // use wbemtest tool to query all classes for namespace root\cimv2
                return $WbemServices->ExecQuery( $query );
            } catch ( \com_exception $e ) {
                echo $e->getMessage();
            }
        } elseif ( ! extension_loaded( 'com_dotnet' ) )
            trigger_error( 'It seems that the COM is not enabled in your php.ini', E_USER_WARNING );
        else {
            $err = error_get_last();
            trigger_error( $err['message'], E_USER_WARNING );
        }
    
        return false;
    }
    
    // _dir_in_allowed_path this is your function to detect if a file is withing the allowed path (see the open_basedir PHP directive)
    function getSystemMemoryInfo( $output_key = '' ) {
        $keys = array( 'MemTotal', 'MemFree', 'MemAvailable', 'SwapTotal', 'SwapFree' );
        $result = array();
    
        try {
            // LINUX
            if ( ! isWin() ) {
                $proc_dir = '/proc/';
                $data = _dir_in_allowed_path( $proc_dir ) ? @file( $proc_dir . 'meminfo' ) : false;
                if ( is_array( $data ) )
                    foreach ( $data as $d ) {
                        if ( 0 == strlen( trim( $d ) ) )
                            continue;
                        $d = preg_split( '/:/', $d );
                        $key = trim( $d[0] );
                        if ( ! in_array( $key, $keys ) )
                            continue;
                        $value = 1000 * floatval( trim( str_replace( ' kB', '', $d[1] ) ) );
                        $result[$key] = $value;
                    }
            } else      // WINDOWS
            {
                $wmi_found = false;
                if ( $wmi_query = wmiWBemLocatorQuery( 
                    "SELECT FreePhysicalMemory,FreeVirtualMemory,TotalSwapSpaceSize,TotalVirtualMemorySize,TotalVisibleMemorySize FROM Win32_OperatingSystem" ) ) {
                    foreach ( $wmi_query as $r ) {
                        $result['MemFree'] = $r->FreePhysicalMemory * 1024;
                        $result['MemAvailable'] = $r->FreeVirtualMemory * 1024;
                        $result['SwapFree'] = $r->TotalSwapSpaceSize * 1024;
                        $result['SwapTotal'] = $r->TotalVirtualMemorySize * 1024;
                        $result['MemTotal'] = $r->TotalVisibleMemorySize * 1024;
                        $wmi_found = true;
                    }
                }
                // TODO a backup implementation using the $_SERVER array
            }
        } catch ( Exception $e ) {
            echo $e->getMessage();
        }
        return empty( $output_key ) || ! isset( $result[$output_key] ) ? $result : $result[$output_key];
    }
    

    8GB RAM系统上的示例

    print_r(getSystemMemoryInfo());
    

    输出

    Array
    (
        [MemTotal] => 8102684000
        [MemFree] => 2894508000
        [MemAvailable] => 4569396000
        [SwapTotal] => 4194300000
        [SwapFree] => 4194300000
    )
    

    read more .

        7
  •  1
  •   Helmut Hoffer von Ankershoffen    7 年前

    //助手

    /**
     * @return array|null
     */
    protected function getSystemMemInfo()
    {
        $meminfo = @file_get_contents("/proc/meminfo");
        if ($meminfo) {
            $data = explode("\n", $meminfo);
            $meminfo = [];
            foreach ($data as $line) {
                if( strpos( $line, ':' ) !== false ) {
                    list($key, $val) = explode(":", $line);
                    $val = trim($val);
                    $val = preg_replace('/ kB$/', '', $val);
                    if (is_numeric($val)) {
                        $val = intval($val);
                    }
                    $meminfo[$key] = $val;
                }
            }
            return $meminfo;
        }
        return  null;
    }
    
    // example call to check health
    public function check() {
        $memInfo = $this->getSystemMemInfo();
        if ($memInfo) {
            $totalMemory = $memInfo['MemTotal'];
            $freeMemory = $memInfo['MemFree'];
            $swapTotalMemory = $memInfo['SwapTotal'];
            $swapFreeMemory = $memInfo['SwapFree'];
            if (($totalMemory / 100.0) * 30.0 > $freeMemory) {
                if (($swapTotalMemory / 100.0) * 50.0 > $swapFreeMemory) {
                    return new Failure('Less than 30% free memory and less than 50% free swap space');
                }
                return new Warning('Less than 30% free memory');
            }
        }
        return new Success('ok');
    }
    
        8
  •  -2
  •   Pascal MARTIN    15 年前

    我不记得曾经见过这样的函数——实际上,它超出了PHP的功能范围。

    (见 sys_getloadavg (举一个这样的例子)