web-dev-qa-db-fra.com

obtenir le serveur ram avec php

Existe-t-il un moyen de connaître le bélier disponible sur un serveur (distribution Linux) avec php (widthout en utilisant les commandes linux)?

edit: désolé, l’objectif est d’être conscient de la mémoire RAM disponible sur le serveur/la machine virtuelle, pour le serveur particulier (même si cette mémoire est partagée).

29
yoda

Si vous savez que ce code ne fonctionnera que sous Linux, vous pouvez utiliser le fichier spécial /proc/meminfo pour obtenir des informations sur le sous-système de mémoire virtuelle du système. Le fichier a une forme comme ceci:

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

Cette première ligne, MemTotal: ..., contient la quantité de RAM physique sur la machine, moins l'espace réservé par le noyau pour son propre usage. À ma connaissance, c’est la meilleure façon d’obtenir un simple rapport sur la mémoire utilisable sur un système Linux. Vous devriez pouvoir l'extraire via quelque chose comme le code suivant:

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

(Remarque: ce code peut nécessiter quelques modifications pour votre environnement.)

36
rcoder

Utiliser /proc/meminfo et tout mettre dans un tableau est simple:

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

Les commandes Linux peuvent être exécutées en utilisant la fonction exec en PHP. Ceci est efficace et fera le travail (si l'objectif est d'obtenir de la mémoire).

Essayez le code suivant:

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

// aides

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

Il convient de noter que, sous Windows, ces informations (et bien d’autres encore) peuvent être acquises en exécutant et en analysant le résultat de la commande Shell: systeminfo

1
xendi

Je ne pense pas que vous puissiez accéder aux informations sur la mémoire du serveur hôte sans une extension écrite spéciale PHP. La bibliothèque principale PHP ne permet pas (peut-être pour des raisons de sécurité) d'accéder aux informations sur la mémoire étendue.

Toutefois, si votre script a accès au /proc/meminfo, vous pouvez interroger ce fichier spécial et récupérer les informations dont vous avez besoin. Sous Windows (bien que vous ne l'ayez pas demandé), nous pouvons utiliser l'extension com_dotnet PHP pour interroger le framework Windows via COM.

Vous trouverez ci-dessous ma getSystemMemoryInfo qui retourne ces informations pour vous, que vous exécutiez le script sur un serveur Linux/Windows. La wmiWBemLocatorQuery est juste une fonction d'assistance.

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

Exemple sur un système _ de 8 Go RAM

print_r(getSystemMemoryInfo());

Sortie

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

Si vous voulez comprendre ce que chaque champ représente, alors lisez plus .

1
Eugen Mihailescu

version plus courte

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