Подтвердить что ты не робот

Получить серверный ram с php

Есть ли способ узнать доступный ram на сервере (linux distro) с php (ширина с помощью команд Linux)?

edit: извините, цель состоит в том, чтобы знать о сервере, доступном на сервере/виртуальной машине, для конкретного сервера (даже если эта память является общей).

4b9b3361

Ответ 1

Если вы знаете, что этот код работает только под 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: ... содержится количество физической памяти в машине, за исключением места, зарезервированного ядром для собственного использования. Это лучший способ получить простой отчет о полезной памяти в системе 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

Использование '/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

Команды Linux могут быть запущены с помощью функции exec в PHP. Это эффективно и будет выполнять работу (если целью является получение памяти).

Попробуйте использовать следующий код:

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

Ответ 4

Стоит отметить, что в Windows эту информацию (и многое другое) можно получить, выполнив и проанализировав вывод команды оболочки: systeminfo

Ответ 5

Я не думаю, что вы можете получить доступ к информации о памяти хост-сервера без специального письменного расширения PHP. Основная библиотека PHP не позволяет (возможно, по соображениям безопасности) получить доступ к информации расширенной памяти.

Однако, если ваш script имеет доступ к /proc/meminfo, вы можете запросить этот специальный файл и получить необходимую информацию. В Windows (хотя вы этого не просили) мы можем использовать расширение com_dotnet PHP для запроса оболочки Windows через COM.

Ниже вы можете найти мой getSystemMemoryInfo, который возвращает эту информацию для вас независимо от того, запускаете ли вы script на сервере 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];
}

Пример системы с 8 ГБ оперативной памяти

print_r(getSystemMemoryInfo());

Выход

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

Если вы хотите понять, что представляет собой каждое поле, тогда читать дальше.

Ответ 6

//помощники

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

Ответ 7

Я не помню, чтобы когда-либо видел такую ​​функцию - ее вид вне рамки того, для чего создан PHP.

Даже если бы была такая функциональная функция, она, вероятно, была бы реализована таким образом, который будет специфичен для базовой операционной системы и, вероятно, не будет работать как в Linux, так и в окнах (см. sys_getloadavg для примера такого рода вещей)