3
votes

Background

I understand how PHP's memory_limit setting can be used to control how much memory is available for PHP to use.

As well as using this property to raise/lower the memory limit for your script, you can also set it to -1 to disable the memory limit altogether.

However, as we all know, a computer does not have infinite memory, therefore all we are really talking about is removing any self-imposed limits implemented by PHP itself.

An illustration

We can demonstrate that this is true, by using the following script:

<?php

    print("Original: ");
    print(ini_get('memory_limit'));

    ini_set('memory_limit', -1);

    print(", New: ");
    print(ini_get('memory_limit'));

    $x = "123456789ABCDEF";
    while (true)
        $x .= $x;

?>

When running from the command-line, I get the following output:

Original: 128M, New: -1

PHP Fatal error: Out of memory (allocated 503840768) (tried to allocate 1006632961 bytes) in test.php on line 14

Fatal error: Out of memory (allocated 503840768) (tried to allocate 1006632961 bytes) in test.php on line 14

zend_mm_heap corrupted

And from the web (via Apache) I get something similar:

Original: 128M, New: -1

Fatal error: Out of memory (allocated 503840768) (tried to allocate 1006632961 bytes) in test.php on line 14

In my examples, the values are the same (~480MB) so it doesn't appear that the web server is imposing a limit. Also, this is nowhere near the amount of RAM installed in the system (even ignoring virtual memory) so it is not a hardware limitation.

Note that these tests were run on PHP 5.6 on a Windows machine with 4GB of RAM. However, output is similar on other PHP versions.

Finally, we come to a question!

Given the above:

  1. What actually dictates the memory limit when we set it to -1?
  2. Is there a way of finding out what this limit is from within PHP?
1
You're running out of RAM when you try to allocate a total of 1.5 GB, not 480 MB. Presumably other services - the operating system, databases, etc. - on the machine are using up some of the 4 GB.ceejayoz
The operating system.Victor
@HappyDog I don't think references are required for "operating systems need some RAM to run".ceejayoz
My question got a downvote, but no explanation. If there's something I could do to improve it, please let me know in the comments.HappyDog
@HappyDog i hesitated to say “the available RAM” because a swap configuration may be involvedVictor

1 Answers

2
votes

When you set memory_limit to -1 the actual limit is memory available to operating system.

By available memory I mean sum of physical memory(RAM) and virtual memory(SWAP) minus memory currently used by others processes, and operating system itself. This is hardware limitation, you just have to consider other processes as well.

For example given 4GB of RAM, no SWAP, and other processes(DB, WebBrowser, etc.) consuming 3GB of memory, you have ~1GB available to be used by PHP. When you try to use more operating system rejects memory allocation request, and subsequently PHP exits with "out of memory" error.


There is no method which can be used across different operating systems, PHP don't provide functions to check how much memory is available and used in the environment. If you know your application is running on Linux you can try to read memory info from /proc/meminfo.

<?php
echo file_get_contents("/proc/meminfo");

which will output something like:

MemTotal:        1999084 kB
MemFree:          174344 kB
MemAvailable:    1077264 kB
Buffers:          151328 kB
Cached:           726752 kB
...

Based on that you can try to estimate amount of available memory, be advised memory used by other processes will vary with time.