1

I'm trying to test memory allocation in a php script. I have the limit set to 128M in php.ini. In the script, ini_get('memory_limit') reports 128M as the limit. The problem is, when I start allocating space I can't go beyond 23M. I can restrict memory allocation to any level below 23M but can't allocate more. Just looking for clues as to where this limit is being imposed.

Here's my test script...

<?php

echo "System imposed memory_limit is set to: " . ini_get('memory_limit') . "<br>\n";
for ($i=1; $i<1000; $i++) {
  $a = loadmem($i);
  echo "You have allocated ". $i . "M (". memory_get_usage() . ") memory in this php script" . "<br />\n";
  unset($a);
}

function loadmem($howmuchmeg) {
  $a = str_repeat("0", $howmuchmeg * 1024 * 1024); // alocating 10 chars times million chars
  return $a;
}

?>

Here's the output using curl...

System imposed memory_limit is set to: 128M<br>
You have allocated 1M (1403632) memory in this php script<br />
You have allocated 2M (2452232) memory in this php script<br />
You have allocated 3M (3500808) memory in this php script<br />
You have allocated 4M (4549384) memory in this php script<br />
You have allocated 5M (5597960) memory in this php script<br />
You have allocated 6M (6646536) memory in this php script<br />
You have allocated 7M (7695112) memory in this php script<br />
You have allocated 8M (8743688) memory in this php script<br />
You have allocated 9M (9792264) memory in this php script<br />
You have allocated 10M (10840848) memory in this php script<br />
You have allocated 11M (11889424) memory in this php script<br />
You have allocated 12M (12938000) memory in this php script<br />
You have allocated 13M (13986576) memory in this php script<br />
You have allocated 14M (15035152) memory in this php script<br />
You have allocated 15M (16083728) memory in this php script<br />
You have allocated 16M (17132304) memory in this php script<br />
You have allocated 17M (18180880) memory in this php script<br />
You have allocated 18M (19229456) memory in this php script<br />
You have allocated 19M (20278032) memory in this php script<br />
You have allocated 20M (21326608) memory in this php script<br />
You have allocated 21M (22375184) memory in this php script<br />
You have allocated 22M (23423760) memory in this php script<br />
You have allocated 23M (24472336) memory in this php script<br />

Here are the relevant error_log entries...

mmap() failed: [12] Cannot allocate memory
PHP Fatal error:  Out of memory (allocated 2097152) (tried to allocate 25165856 bytes) 

Using php 7.0.x and apache2.2

2
  • Can you provide more info on your environment? I just tried your example code in docker running laravel's tinker (docker run -it --rm eboraas/laravel php /var/www/laravel/artisan tinker), and managed to iterate until 110M. Commented Apr 13, 2017 at 19:37
  • Thanks. The problem was memory limitations on the apache user. Commented Apr 14, 2017 at 17:50

2 Answers 2

4

The error indicates that you don't actually have that much memory available. If you had simply exceeded the limit, you'd get a slightly different message:

PHP Fatal error:  Allowed memory size of 268435456 bytes exhausted (tried...

Your issue could be a result of actual memory available or a shell-imposed ulimit.

Sign up to request clarification or add additional context in comments.

7 Comments

That's confusing. Free -m shows 203M free but I get the fatal php error when I try to allocate 25M.
free -m doesn't take ulimit into account.
Thanks! Any idea which limit relates to php memory allocation limits. I see max memory size but is shows 3391328 kbytes. Nothing else in the output looks related to memory limits.
IIRC ulimit -v is the one you're looking for.
You'd need to run it as the user the web server is running under.
|
0

Add this yo yout php script

<?php 

ini_set('memory_limit', '2048M');

?>

2 Comments

Gave that a shot. Same result.
add more memory to it like ini_set('memory_limit', '1000000000000000M');

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.