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

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

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

Solutions Collecting From Web of "получить серверный ram с php"

Если вы знаете, что этот код будет работать только под 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"; ?> 

(Обратите внимание: этот код может потребовать некоторой настройки для вашей среды.)

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

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

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

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

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

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

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

Ниже вы можете найти мою 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]; } 

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

 print_r(getSystemMemoryInfo()); 

Вывод

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

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

// помощники

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

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

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