Você pergunta:
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?
Não. Você está interpretando corretamente um mau conselho sobre memory_limit
que faria você pensar que esse é o caso quando a realidade é memory_limit
tem pouco ou nada a ver com o tamanho do upload do arquivo. memory_limit
é puramente sobre a memória do processo PHP e não tem nada a ver com processos de transferência de arquivos.
Aqui está o porquê ...
Os únicos dois itens que são motivo de preocupação ao fazer o upload de um arquivo usando PHP e Apache são:
-
post_max_size
: define o tamanho máximo dos dados de postagem permitidos. Essa configuração também afeta o upload de arquivos. Para fazer upload de arquivos grandes, esse valor deve ser maior queupload_max_filesize
. De um modo geral,memory_limit
deve ser maior quepost_max_size
. -
upload_max_filesize
: o tamanho máximo de um arquivo enviado.
memory_limit
não tem absolutamente nada a ver com um transporte de arquivos em tal configuração. Tudo o que o memory_limit
faz é controlar a quantidade de memória que cada processo do PHP obtém se estiver processando algo internamente. Eu transferência de arquivos não tem nada a ver com memory_limit
.
-
memory_limit
: define a quantidade máxima de memória em bytes que um script é permitido alocar. Isso ajuda a evitar scripts mal escritos para consumir toda a memória disponível em um servidor. Note que para não ter limite de memória, defina esta diretiva para -1.
Dito isso, o manual do PHP - como citado acima - diz:
Generally speaking,
memory_limit
should be larger thanpost_max_size
.
Isso não faz sentido e é considerado um erro se você pensar sobre isso. memory_limit
é uma restrição de quantos dados podem ser manipulados por um processo PHP na RAM. Mas, como já disse antes, uma transferência de arquivos é um processo de dados de streaming e o PHP não armazena o conteúdo do arquivo na RAM por mais tempo do que o necessário antes de gravá-lo no sistema de arquivos.
Esta resposta de estouro de pilha indica o mesmo. E esta outra resposta explica de forma mais eloquente e sucinta:
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.