pobierz serwer RAM z php


Czy istnieje sposób na sprawdzenie dostępnej pamięci RAM na serwerze (dystrybucja Linuksa) za pomocą php (widthout za pomocą poleceń linux)?
edycja: przepraszam, celem jest uświadomienie sobie pamięci RAM dostępnej na serwerze/maszynie wirtualnej dla określonego serwera (nawet jeśli ta pamięć jest współdzielona).
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Jeśli wiesz, że ten kod będzie działał tylko pod Linuksem, możesz użyć specjalnego pliku
/ proc/meminfo
, aby uzyskać informacje o podsystemie pamięci wirtualnej systemu. Plik ma postać:
MemTotal: 255908 kB
MemFree: 69936 kB
Buffers: 15812 kB
Cached: 115124 kB
SwapCached: 0 kB
Active: 92700 kB
Inactive: 63792 kB...

Pierwsza linia,
MemTotal: ...
, zawiera ilość fizycznej pamięci RAM w komputerze, pomniejszoną o miejsce zarezerwowane przez jądro do własnego użytku. To najlepszy sposób, jaki znam, aby uzyskać prosty raport dotyczący pamięci użytkowej w systemie Linux. Powinieneś być w stanie wyodrębnić go za pomocą czegoś podobnego do następującego kodu:
<?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"; ?>

(Uwaga: ten kod może wymagać dostosowania do Twojego środowiska).
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Łatwo jest użyć
/ proc/meminfo
i umieścić wszystko w tablicy:
<?phpfunction 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"
...
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Polecenia systemu Linux można uruchamiać za pomocą funkcji

exec
http://us1.php.net/function.exec
w PHP. Jest to wydajne i spełni swoje zadanie (jeśli celem jest zdobycie pamięci).
Wypróbuj poniższy kod:
<?php
exec("free -mtl", $output);
print_r($output);
?>
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Warto zauważyć, że w systemie Windows te informacje (i nie tylko) można uzyskać, wykonując i analizując dane wyjściowe polecenia powłoki: systeminfo
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Myślę, że nie można uzyskać dostępu do informacji o pamięci serwera hosta bez dedykowanego rozszerzenia napisanego w PHP. Podstawowa biblioteka PHP nie pozwala (prawdopodobnie ze względów bezpieczeństwa) na dostęp do informacji o rozszerzonej pamięci.
Jeśli jednak Twój skrypt ma dostęp do
/ proc/meminfo
, możesz zażądać tego specjalnego pliku i uzyskać potrzebne informacje. W systemie Windows (chociaż o to nie prosiłeś) możemy użyć rozszerzenia PHP
com_dotnet
do wysyłania zapytań do struktury systemu Windows przez COM.
Poniżej znajduje się moje
getSystemMemoryInfo
, które zwraca te informacje niezależnie od tego, czy uruchamiasz skrypt na serwerze Linux/Windows.
wmiWBemLocatorQuery
to tylko funkcja pomocnicza.
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];
}


Na przykład w systemie 8 GB pamięci RAM

print_r(getSystemMemoryInfo());


Wyjście

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

Jeśli chcesz zrozumieć, czym jest każde pole, to

Czytaj
https://www.centos.org/docs/5/ ... .html
.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

// pomocnicy
/**
* @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');
}
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Mała i zgrabna funkcja do pobierania wszystkich wartości powiązanych z ich kluczami.
$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"
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

skrócona wersja
preg_match('#MemFree:[\s\t]+([\d]+)\s+kB#', file_get_contents('/proc/meminfo'), $matches); 
var_dump($matches[1]);// Free abount in KB
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Nie pamiętam, bym kiedykolwiek widział taką funkcję - w rzeczywistości wykracza ona poza to, do czego PHP zostało zaprojektowane.
Nawet gdyby taka funkcjonalność istniała, prawdopodobnie zostałaby zaimplementowana w sposób specyficzny dla podstawowego systemu operacyjnego i prawdopodobnie nie działałaby zarówno w systemie Linux, jak i Windows.

(cm.
sys_getloadavg
http://php.net/manual/en/funct ... g.php
na przykład tego rodzaju rzeczy

)

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się