Cannot upload files larger than 1GB in PHP under Apache even with 'post_max_size' and 'upload_max_filesize' set to 4096M

Solution 1:

You ask:

So, if the above is true, is it true to state that the true maximum file size that can be uploaded to a webserver through PHP running with Apache is equal to the physical memory on the device hosting?

Nope. You are correctly interpreting bad advice about memory_limit that would make you think that is the case when the reality is memory_limit has little to nothing to do with file upload size. memory_limit is purely about PHP process memory and has nothing to do with file transferring processes.

Here is why…

The only two items that are of concern when uploading a file using PHP and Apache are:

  • post_max_size: Sets max size of post data allowed. This setting also affects file upload. To upload large files, this value must be larger than upload_max_filesize. Generally speaking, memory_limit should be larger than post_max_size.
  • upload_max_filesize: The maximum size of an uploaded file.

memory_limit has utterly nothing to do with a file transport in such a setup. All memory_limit does is control how much memory each PHP process gets if it is processing something internally. I file transfer has nothing to do with memory_limit.

  • memory_limit: This sets the maximum amount of memory in bytes that a script is allowed to allocate. This helps prevent poorly written scripts for eating up all available memory on a server. Note that to have no memory limit, set this directive to -1.

That said, the PHP manual—as quoted above—says:

Generally speaking, memory_limit should be larger than post_max_size.

This makes no sense and is considered a mistake if you think about it. memory_limit is a constraint of how much data can be handled by a PHP process in RAM. But—as I have said before—a file transfer is a streaming data process and PHP doesn’t store the file contents in RAM for longer than it has to before writing it to the file system.

This Stack Overflow answer states as much. And this other answer explains it more eloquently and succinctly:

Only if you plan on reading an entire file into memory and the file that you read in is larger than the space you have allocated to PHP (i.e. memory_limit), in which case you'll run out of memory.