it-swarm.com.de

holen Sie sich Server-RAM mit PHP

Gibt es eine Möglichkeit, den verfügbaren RAM in einem Server (Linux-Distro) mit PHP (Widthout mit Linux-Befehlen) zu kennen?

edit: Entschuldigung, das Ziel ist es, den RAM zu kennen, der auf dem Server/der virtuellen Maschine für den jeweiligen Server verfügbar ist (auch wenn der Speicher gemeinsam genutzt wird).

29
yoda

Wenn Sie wissen, dass dieser Code nur unter Linux ausgeführt wird, können Sie die spezielle /proc/meminfo-Datei verwenden, um Informationen zum virtuellen Speichersubsystem des Systems abzurufen. Die Datei hat ein Formular wie dieses:

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

Diese erste Zeile MemTotal: ... enthält die Menge an physischem RAM in der Maschine abzüglich des vom Kernel für die eigene Verwendung reservierten Speicherplatzes. Es ist die beste Methode, die ich kenne, um einen einfachen Bericht über den nutzbaren Speicher eines Linux-Systems zu erhalten. Sie sollten es über den folgenden Code extrahieren können:

<?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"; ?>

(Bitte beachten Sie: Dieser Code erfordert möglicherweise einige Anpassungen für Ihre Umgebung.)

36
rcoder

Die Verwendung von /proc/meminfo und das Einfügen von allem in ein Array ist einfach:

<?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"
  ...
35
J.C. Inacio

Linux-Befehle können mit der Funktion exec in PHP ausgeführt werden. Dies ist effizient und erledigt die Aufgabe (wenn das Ziel darin besteht, den Speicher zu erhalten).

Versuchen Sie den folgenden Code:

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

// Helfer

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

Es ist erwähnenswert, dass diese Informationen (und vieles mehr) unter Windows abgerufen werden können, indem die Ausgabe des Shell-Befehls ausgeführt und analysiert wird: systeminfo

1
xendi

Ich glaube nicht, dass Sie auf die Speicherinformationen des Host-Servers ohne eine speziell geschriebene Erweiterung von PHP zugreifen können. Die Kernbibliothek PHP erlaubt (möglicherweise aus Sicherheitsgründen) keinen Zugriff auf die Informationen zum erweiterten Speicher.

Wenn Ihr Skript jedoch Zugriff auf /proc/meminfo hat, können Sie diese spezielle Datei abfragen und die benötigten Informationen abrufen. Unter Windows (obwohl Sie nicht danach gefragt haben) können Sie die Erweiterung com_dotnet PHP verwenden, um das Windows-Framework über COM abzufragen.

Unten finden Sie meinen getSystemMemoryInfoname__, der diese Informationen für Sie zurückgibt, unabhängig davon, ob Sie das Skript auf einem Linux/Windows-Server ausführen. Der wmiWBemLocatorQueryist nur eine Hilfsfunktion.

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];
}

Beispiel für ein 8 GB RAM System

print_r(getSystemMemoryInfo());

Ausgabe

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

Wenn Sie wissen möchten, was jedes Feld darstellt, dann lesen Sie mehr .

1

kürzere Version

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