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
memory_get_usage
(PHP 4 >= 4.3.2, PHP 5)
memory_get_usage — PHP'ye ayrılan belleğin miktarını döndürür
Açıklama
int memory_get_usage
([ bool $gerçek_kullanım = false
] )
PHP betiğinize ayrılan belleğin bayt cinsinden miktarını döndürür.
Değiştirgeler
- gerçek_kullanım
-
TRUE olduğu takdirde sistem tarafından PHP'ye ayrılan gerçek bellek miktarı, FALSE olduğunda veya değiştirge belirtilmediğinde emalloc() tarafından kullanılan bellek miktarı raporlanır.
Dönen Değerler
Ayrılan belleğin bayt cinsinden miktarı.
Sürüm Bilgisi
| Sürüm: | Açıklama |
|---|---|
| 5.2.1 | Bu işlevin kullanılabilmesi için derleme sırasında --enable-memory-limit seçeneğini belirtme ihtiyacı ortadan kalktı. |
| 5.2.0 | gerçek_kullanım değiştirgesi eklendi. |
Örnekler
Örnek 1 - memory_get_usage() örneği
<?php
// Bu sadece bir örnektir.
// Miktarlar, sisteminizde farklı olabilir.
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
?>
Ayrıca Bakınız
- memory_get_peak_usage() - PHP'ye ayrılan belleğin azami miktarını döndürür
- memory_limit
memory_get_usage
mario
16-Nov-2009 05:11
16-Nov-2009 05:11
jeff dot peck at snet dot net
19-Aug-2009 04:22
19-Aug-2009 04: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-Nov-2008 04:19
19-Nov-2008 04: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
04-Mar-2008 10:07
04-Mar-2008 10: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
03-Jul-2007 09:25
03-Jul-2007 09: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 08:44
23-Dec-2006 08: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
08-Apr-2006 11:41
08-Apr-2006 11: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 01:02
03-Apr-2006 01: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 07:54
22-Mar-2006 07: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-Aug-2005 07:37
17-Aug-2005 07: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 01:02
14-Jul-2005 01: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 06:28
11-Jul-2005 06: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 07:08
25-May-2005 07: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
01-Dec-2004 03:09
01-Dec-2004 03: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-Nov-2004 09:37
29-Nov-2004 09: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-May-2004 05:31
14-May-2004 05: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-Nov-2003 05:15
11-Nov-2003 05: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!
