PHP Doku:: Returns the amount of memory allocated to PHP - function.memory-get-usage.html

Verlauf / Chronik / History: (1) anzeigen

Sie sind hier:
Doku-StartseitePHP-HandbuchFunktionsreferenzDas Verhalten von PHP beeinflussenPHP-Optionen und -InformationenPHP-Optionen-/-Informationen-Funktionenmemory_get_usage

Ein Service von Reinhard Neidl - Webprogrammierung.

PHP-Optionen-/-Informationen-Funktionen

<<memory_get_peak_usage

php_ini_loaded_file>>

memory_get_usage

(PHP 4 >= 4.3.2, PHP 5)

memory_get_usageReturns the amount of memory allocated to PHP

Beschreibung

int memory_get_usage ([ bool $real_usage = false ] )

Returns the amount of memory, in bytes, that's currently being allocated to your PHP script.

Parameter-Liste

real_usage

Set this to TRUE to get the real size of memory allocated from system. If not set or FALSE only the memory used by emalloc() is reported.

Rückgabewerte

Returns the memory amount in bytes.

Changelog

Version Beschreibung
5.2.1 Compiling with --enable-memory-limit is no longer required for this function to exist.
5.2.0 real_usage was added.

Beispiele

Beispiel #1 A memory_get_usage() example

<?php
// This is only an example, the numbers below will
// differ depending on your system

echo memory_get_usage() . "\n"// 36640

$a str_repeat("Hello"4242);

echo 
memory_get_usage() . "\n"// 57960

unset($a);

echo 
memory_get_usage() . "\n"// 36744

?>

Siehe auch


20 BenutzerBeiträge:
- Beiträge aktualisieren...
John Lim
30.11.2010 11:45
It is claimed that this function calls the PHP memory garbage collector by some of the commenters.

A quick check of the source code (PHP 5.2.9) shows that this function does not do any garbage collection.

From var.c:

ZEND_API size_t zend_memory_usage(int real_usage TSRMLS_DC)
{
      if (real_usage) {
            return AG(mm_heap)->real_size;
      } else {
#if MEMORY_LIMIT
            return AG(mm_heap)->size;
#else
            return AG(mm_heap)->real_size;
#endif
      }
}

And from zend_alloc.c

/* {{{ proto int memory_get_usage([real_usage])
    Returns the allocated by PHP memory */
PHP_FUNCTION(memory_get_usage) {
      zend_bool real_usage = 0;

      if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|b", &real_usage) == FAILURE) {
            RETURN_FALSE;
      }
     
      RETURN_LONG(zend_memory_usage(real_usage TSRMLS_CC));
}
/* }}} */
lorin dot weilenmann at gmail dot com
26.11.2010 10:37
I can confirm that this function triggers a garbage collection. I have a script that exceeded 128MB of memory at some point and ended with a fatal error. I was confused, because the script dealt with some large files initially, but the memory load from that point on should have been marginal, and the error occurred at the very end.

Those large files were dealt in a dedicated function and i even used unset() on the variable holding the file after the file was written to disk inside that function. So the memory should have been cleared twice, first after the unset() call, and second once the function ended.

To debug the memory usage, I called memory_get_usage(true) at some points and echo-ed the memory allocation. Just by adding a few echos here and there in the script, the memory usage never exceeded 1MB overhead (on top of the current file size) and the memory error disappeared.
xelozz -at- gmail.com
18.02.2010 11:34
To get the memory usage in KB or MB

<?php
function convert($size)
 {
   
$unit=array('b','kb','mb','gb','tb','pb');
    return @
round($size/pow(1024,($i=floor(log($size,1024)))),2).' '.$unit[$i];
 }

echo
convert(memory_get_usage(true)); // 123 kb
?>
mario
16.11.2009 18:11
not sure how this works internally but I have observed sort of side effects here: calling this function apparently triggers PHP's "garbage collector" -- and frees some memory. I managed to "fix" some savagely coded mess of a web application solely by calling this function just before the code that would usually throw out-of-memory errors. the php version there was 5.2.10
jeff dot peck at snet dot net
19.08.2009 18:22
To get the memory usage in KB or MB

<?php
   
function echo_memory_usage() {
       
$mem_usage = memory_get_usage(true);
       
        if (
$mem_usage < 1024)
            echo
$mem_usage." bytes";
        elseif (
$mem_usage < 1048576)
            echo
round($mem_usage/1024,2)." kilobytes";
        else
            echo
round($mem_usage/1048576,2)." megabytes";
           
        echo
"<br/>";
    }
?>
miteigi nemoto (miteigi at yandex dot ru)
19.11.2008 5:19
Decision a memory_get_usage problem for windows system

Tested OS: Windows XP
Server: Apache

PHP must be loaded as CGI to get correctly memory usage by Process ID ( getmypid() ) and with cmd-tools like tasklist.exe

PHP as CGI have your own PID instead constant Apache PID and you get a true memory size independed form Apache memory usage.

Configure in httpd.conf of Apache:

1. Comment the line like this:
LoadModule php4_module "/usr/local/php/sapi/php4apache.dll"
or
LoadModule php5_module "/usr/local/php5/php5apache.dll"

2. Add this and edit your path to php:
<Directory "z:/usr/local/php">
  Options ExecCGI
</Directory>
ScriptAlias "/__php_dir__/" "z:/usr/local/php/"
Action application/x-httpd-php "/__php_dir__/php.exe"

3. Restart Apache

Use this PHP-code:

<?php
/**
* A memory_get_usage() for Windows System, wich compiled without --enable-memory-limit
* PHP must be loaded as CGI
* Greetings form miteigi nemoto
* @return string
*/
function memory_get_usage_by_tasklist()
{
   
$output = array();
   
exec( 'tasklist ', $output );
    foreach (
$output as $value)
    {
       
$ex=explode(" ",$value);
       
$count_ex=count($ex);
        if (
eregi(" ".getmypid()." Console",$value))
        {
           
$memory_size=$ex[$count_ex-2]." Kb";
            return
$memory_size;
        }
    }
}
echo
memory_get_usage_by_tasklist();
?>
Cory
4.03.2008 23:07
A note to the previous post, it depends on how you've setup PHP. If you've set it up via CGI/FastCGI you will get the PHP process size.

If you are using a module, you will get the whole process that loads the module.
php_dev at dunnbypaul dot net
3.07.2007 23:25
Regarding the function posted by
e dot a dot schultz at gmail dot com

I am running XAMPP on a windows box and the memory usage that the function is giving me is for the entire instance of apache.exe. Thats a lot more memory than my single PHP process. Maybe this works as expected on IIS, but not on apache!  (I am getting a report of about 26MB on win vs. only 700k on Linux).
joe at schmoe dot com
23.12.2006 9:44
the various memory_get_usage replacements here don't seem to work on Mac OS X 10.4(Intel)

I got it to work like this...

<?php
function memory_get_usage()
{
    
$pid = getmypid();
    
exec("ps -o rss -p $pid", $output);
     return
$output[1] *1024;
}
?>
e dot a dot schultz at gmail dot com
9.04.2006 1:41
This is a function that should work for both Windows XP/2003 and most distrabutions of UNIX and Mac OS X.

<?php
if( !function_exists('memory_get_usage') )
{
    function
memory_get_usage()
    {
       
//If its Windows
        //Tested on Win XP Pro SP2. Should work on Win 2003 Server too
        //Doesn't work for 2000
        //If you need it to work for 2000 look at http://us2.php.net/manual/en/function.memory-get-usage.php#54642
       
if ( substr(PHP_OS,0,3) == 'WIN')
        {
               if (
substr( PHP_OS, 0, 3 ) == 'WIN' )
                {
                   
$output = array();
                   
exec( 'tasklist /FI "PID eq ' . getmypid() . '" /FO LIST', $output );
       
                    return
preg_replace( '/[\D]/', '', $output[5] ) * 1024;
                }
        }else
        {
           
//We now assume the OS is UNIX
            //Tested on Mac OS X 10.4.6 and Linux Red Hat Enterprise 4
            //This should work on most UNIX systems
           
$pid = getmypid();
           
exec("ps -eo%mem,rss,pid | grep $pid", $output);
           
$output = explode("  ", $output[0]);
           
//rss is given in 1024 byte units
           
return $output[1] * 1024;
        }
    }
}
?>
xolox at home dot nl
3.04.2006 15:02
<?php

// Original from http://php.net/memory_get_usage by websjwans at hotmail dot com. Thanks alot!
if ( ! function_exists( 'memory_get_usage' ) ):
   
// Only define function if it doesn't exist
   
function memory_get_usage()
    {
       
// If we are running on Windows
       
if ( substr( PHP_OS, 0, 3 ) == 'WIN' ):
           
$output = array();
           
// Should check whether tasklist is available, but I'm lazy
           
exec( 'tasklist /FI "PID eq ' . getmypid() . '" /FO LIST', $output );
           
// Filter non-numeric characters from output. Why not use substr & strpos?
            // I'm running Windows XP Pro Dutch, and it's output does not match the
            // English variant, as will all other translations. This is a more generic
            // approach, and has a better chance of actually working
           
return preg_replace( '/[^0-9]/', '', $output[5] ) * 1024;
           
// Tasklist outputs memory usage in kilobytes, memory_get_usage in bytes.
            // So we multiply by 1024 and in the process convert from string to integer.
       
else:
            return
false;
        endif;
    }
endif;

?>

Works for me. Functionality should match memory_get_usage(), albeit slower (exec & regex). Have fun!

- Peter Odding
John Ring
22.03.2006 8:54
Oops, that was a question.

I'll change it to a note simply:

Note: This is NOT enabled at all in the Win32 builds.

Best regards
grey - greywyvern - com
17.08.2005 21:37
If nothing else in the user notes below works for you, you can get a very (VERY) rough estimate of PHP memory usage by outputting the $GLOBALS array, stripping it of indentation whitespace, and counting the characters in the resulting string.  This method has a very high overhead (to be expected), but works on all operating systems, regardless of whether or not they have the --enable-memory-limit config option set.  I find that the syntax overhead of the print_r() statement roughly accounts for the PHP runtime base memory usage.

The code below is set up to work on all arrays, not just the $GLOBALS array.  Keep in mind that outside data referenced by resource IDs, such as database results and open file data, is not included in this total.

<?php

function array_size($arr) {
 
ob_start();
 
print_r($arr);
 
$mem = ob_get_contents();
 
ob_end_clean();
 
$mem = preg_replace("/\n +/", "", $mem);
 
$mem = strlen($mem);
  return
$mem;
}

$memEstimate = array_size($GLOBALS);

?>

Use only if being off to either side by at least 20% is acceptible for your purposes.
vesa dot kivisto at nepton dot fi
14.07.2005 15:02
[EDIT by danbrown AT php DOT net: This function will only extend Windows versions of PHP where the server has the required third-party software.]

I was unable to get the previous examples working properly and created code which works at least for me. Enjoy!

<?php
// Please note that you'll need the pslist.exe utility from http://www.sysinternals.com/Utilities/PsTools.html
// This is because win/2000 itself does not provide a task list utility.
//
function getMemoryUsage() {

 
// try to use PHP build in function
 
if( function_exists('memory_get_usage') ) {
  return
memory_get_usage();
 }

 
// Try to get Windows memory usage via pslist command
 
if ( substr(PHP_OS,0,3) == 'WIN') {
 
 
$resultRow = 8;
 
$resultRowItemStartPosition = 34;
 
$resultRowItemLength = 8;
 
 
$output = array();
 
exec('pslist -m ' . getmypid() , $output);
   
  return
trim(substr($output[$resultRow], $resultRowItemStartPosition, $resultRowItemLength)) . ' KB';
 
 }

 
 
// No memory functionality available at all
 
return '<b style="color: red;">no value</b>';
 
}
?>
guenter_doege at web dot de
11.07.2005 8:28
The Win XP / 2003 workaround script will also work with windows 2000 with a few slight modifications.

Please note that you'll need the pslist.exe utility from http://www.sysinternals.com/Utilities/PsTools.html because win/2000 itself does not provide a task list utility.

<?php

function getMemUsage()
{
    
       if (
function_exists('memory_get_usage'))
       {
           return
memory_get_usage();
       }
       else if (
substr(PHP_OS,0,3) == 'WIN')
       {
          
// Windows 2000 workaround

          
$output = array();
          
exec('pslist ' . getmypid() , $output);
           return
trim(substr($output[8],38,10));
       }
       else
       {
           return
'<b style="color: red;">no value</b>';
       }
}
?>
MagicalTux at FF dot st
25.05.2005 9:08
When you need to get the OS, do not use $_SERVER['OS'] or $_ENV['OS'], better use PHP_OS constant !
<?php
if (substr(PHP_OS,0,3)=='WIN') {
 
// [...]
}
?>

You also have other values such as CYGWIN_NT-5.0, Linux, ... this is the best way to get system's os (anyone on linux can do an "export OS=windows")
webNOSPAMsjwans at hotmail dot com
1.12.2004 16:09
A quick and dirty Windows XP / 2003 wordaround:

<?php

function getMemUsage()
{
       
        if (
function_exists('memory_get_usage'))
        {
            return
memory_get_usage();
        }
        else if (
strpos( strtolower($_SERVER["OS"]), 'windows') !== false)
        {
           
// Windows workaround
           
$output = array();
           
           
exec('tasklist /FI "PID eq ' . getmypid() . '" /FO LIST', $output);           
            return
substr($output[5], strpos($output[5], ':') + 1);
        }
        else
        {
            return
'<b style="color: red;">no value</b>';
        }
}

?>
randolphothegreat at yahoo dot com
29.11.2004 22:37
[EDIT by danbrown AT php DOT net: This is intended by the author to only be used with PHP 4 < 4.3.2.]

I'd just like to point out that although sandeepc at myrealbox dot com's idea for displaying the current memory usage is a good one, it's perhaps a bad idea to pipe the entire process list through grep. A better performing method would be to select only the process we're interested in:

<?php
$pid
= getmypid();
error_log('MEMORY USAGE (% KB PID ): ' . `ps --pid $pid --no-headers -o%mem,rss,pid`);
?>

True, it's not much of a performance boost, but every bit helps.
ad-rotator.com
14.05.2004 19:31
The method sandeepc at myrealbox dot com posted yields larger memory usage, my guess is that it includes all the PHP interpreter/internal code and not just the script being run.

1) Use ps command
MEMORY USAGE (% KB PID ):  0.8 12588 25087 -> about 12MB
2) Use memory_get_usage()
int(6041952) -> about 6MB
sandeepc at myrealbox dot com
11.11.2003 18:15
To get this in pre-4.3.2 do (works on unix like systems only):

$my_pid = getmypid();
error_log("MEMORY USAGE (% KB PID ): ".`ps -eo%mem,rss,pid | grep $my_pid`);

found this tip somewhere in bugs.php.net!



PHP Powered Diese Seite bei php.net
The PHP manual text and comments are covered by the Creative Commons Attribution 3.0 License © the PHP Documentation Group - Impressum - mail("TO:Reinhard Neidl",...)