php 用php获取服务器ram

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/1455379/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-25 02:39:15  来源:igfitidea点击:

get server ram with php

phpram

提问by yoda

Is there a way to know the avaliable ram in a server (linux distro) with php (widthout using linux commands)?

有没有办法用php(使用linux命令的widthout)知道服务器(linux发行版)中的可用内存?

edit: sorry, the objective is to be aware of the ram available in the server / virtual machine, for the particular server (even if that memory is shared).

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

回答by rcoder

If you know this code will only be running under Linux, you can use the special /proc/meminfofile to get information about the system's virtual memory subsystem. The file has a form like this:

如果您知道此代码只能在 Linux 下运行,您可以使用该特殊/proc/meminfo文件来获取有关系统虚拟内存子系统的信息。该文件具有如下形式:

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

That first line, MemTotal: ..., contains the amount of physical RAM in the machine, minus the space reserved by the kernel for its own use. It's the best way I know of to get a simple report of the usable memory on a Linux system. You should be able to extract it via something like the following code:

第一行,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"; ?>

(Please note: this code may require some tweaking for your environment.)

(请注意:此代码可能需要针对您的环境进行一些调整。)

回答by J.C. Inacio

Using /proc/meminfoand getting everything into an array is simple:

使用/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() );

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"
  ...

回答by fotuzlab

Linux commands can be run using the execfunction in PHP. This is efficient and will do the job(if objective is to get the memory).

可以使用PHP 中的exec函数运行 Linux 命令。这是有效的并且可以完成工作(如果目标是获取内存)。

Try the following code:

试试下面的代码:

<?php
  exec("free -mtl", $output);
  print_r($output);
?>

回答by xendi

It is worth noting that in Windows this information (and much more) can be acquired by executing and parsing the output of the shell command: systeminfo

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

回答by Eugen Mihailescu

I don't think you can access the host server memory info without a special written PHP extension. The PHP core library does not allow (perhaps for security reasons) to access the extended memory info.

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

However, if your script has access to the /proc/meminfothen you can query that special file and grab the info you need. On Windows (although you've not asked for it) we can use the com_dotnetPHP extension to query the Windows framework via COM.

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

Below you can find my getSystemMemoryInfothat returns that info for you no matter if you run the script on a Linux/Windows server. The wmiWBemLocatorQueryis just a helper function.

getSystemMemoryInfo无论您是否在 Linux/Windows 服务器上运行脚本,您都可以在下面找到我的返回该信息的信息。这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];
}

Example on a 8GB RAM system

8GB RAM 系统示例

print_r(getSystemMemoryInfo());

Output

输出

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

If you want to understand what each field represent then read more.

如果您想了解每个字段代表什么,请阅读更多内容

回答by Helmut Hoffer von Ankershoffen

// helpers

// 帮手

/**
 * @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');
}

回答by Mahdyfo

Small and tidy function to get all of its values associated to their keys.

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

$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"

回答by Elvis Ciotti

shorter version

较短的版本

preg_match('#MemFree:[\s\t]+([\d]+)\s+kB#', file_get_contents('/proc/meminfo'), $matches); 
var_dump($matches[1]); // Free abount in KB

回答by Pascal MARTIN

I don't remember having ever seen such a function -- its kind of out the scope of what PHP is made for, actually.

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

Even if there was such a functionnality, it would probably be implemented in a way that would be specific to the underlying operating system, and wouldn't probably work on both Linux and windows (see sys_getloadavgfor an example of that kind of thing)

即使有这样的功能,它也可能以特定于底层操作系统的方式实现,并且可能无法在 Linux 和 Windows 上运行(请参阅sys_getloadavg有关此类事情的示例)