PHP
downloads | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

php_ini_loaded_file> <memory_get_peak_usage
Last updated: Fri, 15 Aug 2008

view this page in

memory_get_usage

(PHP 4 >= 4.3.2, PHP 5)

memory_get_usagePHP に割り当てられたメモリの量を返す

説明

int memory_get_usage ([ bool $real_usage ] )

現在の PHP スクリプトに割り当てられたメモリの量をバイト単位で返します。

パラメータ

real_usage

これを TRUE に設定すると、システムが割り当てた実際のメモリの大きさを取得します。 省略したり FALSE を設定したりすると、 emalloc() が使用するメモリのみを報告します。

返り値

メモリの量をバイト単位で返します。

変更履歴

バージョン 説明
5.2.1 この関数を使用するために、 --enable-memory-limit でコンパイルすることは必須ではなくなりました。
5.2.0 real_usage が追加されました。

例1 memory_get_usage() の例

<?php
// これは単なる例にすぎません。
// 以下の数値はシステムによって変化します。

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

?>



php_ini_loaded_file> <memory_get_peak_usage
Last updated: Fri, 15 Aug 2008
 
add a note add a note User Contributed Notes
memory_get_usage
Cory
05-Mar-2008 09: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
04-Jul-2007 07: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-Dec-2006 07: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
09-Apr-2006 09: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
03-Apr-2006 11: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-Mar-2006 06: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
18-Aug-2005 05: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-Jul-2005 11: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-Jul-2005 04: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-May-2005 05: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
02-Dec-2004 02: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
30-Nov-2004 08: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
15-May-2004 03: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
12-Nov-2003 04: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_ini_loaded_file> <memory_get_peak_usage
Last updated: Fri, 15 Aug 2008
 
 
show source | credits | stats | sitemap | contact | advertising | mirror sites