الحصول على خادم ذاكرة الوصول العشوائي مع php

StackOverflow https://stackoverflow.com/questions/1455379

  •  12-09-2019
  •  | 
  •  

سؤال

هل هناك طريقة لمعرفة ذاكرة الوصول العشوائي المتوفرة في خادم (Linux Distro) مع PHP (Widthout باستخدام أوامر Linux)؟

تحرير: عذرا، الهدف هو أن تكون على دراية ذاكرة الوصول العشوائي المتاحة في الجهاز / الجهاز الظاهري، لخادم معين (حتى إذا كانت هذه الذاكرة مشتركة).

هل كانت مفيدة؟

المحلول

إذا كنت تعرف أن هذا الرمز لن يعمل إلا تحت 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 هذه المعلومات (وأكثر من ذلك بكثير) يمكن الحصول عليها عن طريق تنفيذ وتحليل إخراج أمر Shell: 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];
}

مثال على نظام ذاكرة الوصول العشوائي 8GB

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

نسخة أقصر

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

لا أتذكر أن شهدت مثل هذه الوظيفة - نوعها من نطاق ما يتم إجراؤه من أجله، في الواقع.

حتى لو كانت هناك مثل هذه الوظيفة، فمن المحتمل أن تنفذ بطريقة خاصة بنظام التشغيل الأساسي، ولن تعمل على الأرجح على كل من Linux و Windows (يرى sys_getloadavg مثال على هذا النوع من الأشياء)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top