Pelo que entendi, ao hospedar um servidor da web com Apache e PGP, as três configurações php.ini
que determinam o tamanho máximo de upload são:
memory_limit
post_max_size
upload_max_filesize
Como eu li, memory_limit
deve ser maior que post_max_size
e post_max_size
deve ser maior que upload_max_filesize
. A partir daí, o menor, o que seria upload_max_filesize
, na verdade, seria o verdadeiro limite para o tamanho do upload, dentro das configurações do Apache.
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? Além das limitações de gravação em disco, como o NTFS limita o tamanho do arquivo a 4 GB por arquivo?
O motivo pelo qual estou perguntando isso é meu post_max_size
e upload_max_filesize
está definido como 4096M, mas enquanto arquivos com menos de 1 GB são carregados sem problemas, arquivos com mais de 1 GB não. Então, seria memory_limit
um fator contribuinte para algo assim?
fonte
memory_limit
deve ser maior do quepost_max_size
.”Respostas:
Você pergunta:
Não. Você está interpretando corretamente os maus conselhos
memory_limit
que o fazem pensar que esse é o caso quando a realidadememory_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 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 carregado.memory_limit
não tem absolutamente nada a ver com o transporte de arquivos nessa configuração. Tudo o quememory_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 commemory_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:
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:
fonte