I'm creating a script that needs to exit when it hits a certain amount of memory usage. Here's my test script:
<?php
$memory_sapper = array();
$i = 0;
while (True){
array_push($memory_sapper, $i);
print($i);
print(PHP_EOL);
print((memory_get_usage()/1024)/1024 . " Mb");
print(PHP_EOL);
print(memory_get_usage() . " bytes");
print(PHP_EOL);
if ($i == 10000){
print("Memory Limit: " . ini_get('memory_limit'));
print(PHP_EOL);
exit;
}
$i ;
}
When I run php -d memory_limit=0.5M test.php
, memory usage starts at 0.3M and grows to 0.8M. I expected the script to error around $i == 5000
but it's not, it goes past the memory limit of 0.5M.
print("Memory Limit: " . ini_get('memory_limit'));
in the script shows that the memory limit is set to 0.5M.
Even php -d memory_limit=0 test.php
doesn't keep the script from running.
If I increase $i
to 100k, the script finally errors at 1.38 Mb or 1447328 bytes according to memory_get_usage
. I'm unsure why it does't error sooner. Also, the number of bytes according to memory_get_usage
isn't very close to the number of bytes recorded in the error. Here's the error message:
PHP Fatal error: Allowed memory size of 2097152 bytes exhausted (tried to allocate 2097160 bytes) in ~/test.php on line 7
Any insights would be valuable. Thank you!
CodePudding user response:
"0.5M" is not a valid value for memory_limit
. If you look up memory_limit
in the PHP manual, it links to this FAQ about the shorthand notation it accepts, which gives exactly that example:
Note that the numeric value is cast to int; for instance, 0.5M is interpreted as 0.
So to set to "half a megabyte", you need to specify it in a whole number of kilobytes or bytes: memory_limit=500k
or memory_limit=512000