Não é possível fazer upload de arquivos maiores que 1GB em PHP no Apache, mesmo com 'post_max_size' e 'upload_max_filesize' definido como 4096M

1

Pelo que entendi, ao hospedar um servidor Web com Apache e PGP, as três configurações em php.ini que determinam o tamanho máximo de upload são:

  1. memory_limit
  2. post_max_size
  3. upload_max_filesize

Como 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, que seria upload_max_filesize , seria o verdadeiro limite para o tamanho do upload, dentro das configurações do Apache.

Então, se o acima for verdadeiro, é verdade que o tamanho máximo real do arquivo que pode ser enviado para um servidor web através do PHP rodando com o Apache é igual à memória física na hospedagem do dispositivo? Além das limitações de gravação em disco, ou seja, como o NTFS limita o tamanho do arquivo a 4 GB por arquivo?

O motivo pelo qual estou perguntando isso é que meus post_max_size e upload_max_filesize estão definidos como 4096M, mas enquanto arquivos com pouco menos de 1 GB de upload sem problemas, arquivos acima de 1GB não. Então, memory_limit seria um fator contribuinte em algo assim?

    
por Eric F 23.08.2018 / 19:05

1 resposta

2

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 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 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 than 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 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.

    
por 23.08.2018 / 19:37