Você pergunta:
Portanto, se o exposto acima é verdadeiro, é verdade que o tamanho máximo real do arquivo que pode ser carregado em um servidor da web através do PHP em execução com Apache é igual à memória física no dispositivo que hospeda?
Não. Você está interpretando corretamente os maus conselhos memory_limit
que o fazem 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 memória de 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 preocupantes ao fazer upload de um arquivo usando PHP e Apache são:
post_max_size
: Define o tamanho máximo permitido dos dados de postagem. Essa configuração também afeta o upload do arquivo. Para fazer upload de arquivos grandes, esse valor deve ser maior que upload_max_filesize
. De um modo geral, memory_limit
deve ser maior que post_max_size
.
upload_max_filesize
: O tamanho máximo de um arquivo carregado.
memory_limit
não tem absolutamente nada a ver com o transporte de arquivos nessa configuração. Tudo o que memory_limit
faz é controlar a quantidade de memória que cada processo PHP recebe 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 pode alocar. Isso ajuda a evitar scripts mal escritos para consumir toda a memória disponível em um servidor. Observe que, para não ter limite de memória, defina esta diretiva como -1.
Dito isto, o manual do PHP - como citado acima - diz:
De um modo geral, memory_limit
deve ser maior que post_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 eu disse antes, uma transferência de arquivos é um processo de streaming de dados e o PHP não armazena o conteúdo do arquivo na RAM por mais tempo do que antes de gravá-lo no sistema de arquivos.
Essa resposta de estouro de pilha indica tanto. E essa outra resposta explica de maneira mais eloquente e sucinta:
Somente se você planeja ler um arquivo inteiro na memória e o arquivo em que você lê é maior que o espaço que você alocou no PHP (ou seja memory_limit
), nesse caso, você ficará sem memória.