1

Как я понимаю, при хостинге веб-сервера с Apache и PGP три параметра в php.ini , определяющие максимальный размер загрузки:

  1. memory_limit
  2. post_max_size
  3. upload_max_filesize

Как я прочитал, memory_limit должно быть больше, чем post_max_size а post_max_size должно быть больше, чем upload_max_filesize . Оттуда самое низкое, которое будет upload_max_filesize , фактически будет истинным пределом для размера загрузки, в любом случае в настройках Apache.

Итак, если вышеприведенное верно, верно ли утверждать, что истинный максимальный размер файла, который можно загрузить на веб-сервер через PHP, работающий с Apache, равен физической памяти на хосте устройства? Помимо ограничений записи на диск, то есть, как NTFS ограничивает размер файла до 4 ГБ на файл?

Причина, по которой я спрашиваю это, состоит в том, что мои post_max_size и upload_max_filesize установлены на 4096M, но в то время как файлы с загрузкой чуть менее 1 ГБ без проблем, файлы более 1 ГБ этого не делают. Так будет ли memory_limit способствовать этому?

1 ответ1

2

Ты спрашиваешь:

Итак, если вышеприведенное верно, верно ли утверждать, что истинный максимальный размер файла, который можно загрузить на веб-сервер через PHP, работающий с Apache, равен физической памяти на хосте устройства?

Нету. Вы правильно интерпретируете дурной совет о memory_limit , который заставляет вас думать, что это тот случай, когда реальность memory_limit практически не имеет отношения к размеру загружаемого файла. memory_limit относится исключительно к памяти процессов PHP и не имеет ничего общего с процессами передачи файлов.

Вот почему ...

При загрузке файла с использованием PHP и Apache важны только два элемента:

  • post_max_size: устанавливает максимально допустимый размер данных поста. Этот параметр также влияет на загрузку файлов. Для загрузки больших файлов это значение должно быть больше, чем upload_max_filesize . Вообще говоря, memory_limit должен быть больше, чем post_max_size .
  • upload_max_filesize: максимальный размер загружаемого файла.

memory_limit имеет ничего общего с файловым транспортом в такой настройке. Все, что делает memory_limit - это контролирует, сколько памяти получает каждый процесс PHP, если он обрабатывает что-то внутри. У меня передача файлов не имеет ничего общего с memory_limit .

  • memory_limit: устанавливает максимальный объем памяти в байтах, который скрипту разрешено выделять. Это помогает предотвратить плохо написанные сценарии для использования всей доступной памяти на сервере. Обратите внимание, что для ограничения памяти не используйте эту директиву -1.

Тем не менее, руководство по PHP - как указано выше - гласит:

Вообще говоря, memory_limit должен быть больше, чем post_max_size .

Это не имеет смысла и считается ошибкой, если вы об этом думаете. memory_limit является ограничением того, сколько данных может быть обработано процессом PHP в RAM. Но, как я уже говорил, передача файлов - это процесс потоковой передачи данных, и PHP не хранит содержимое файла в ОЗУ дольше, чем нужно, прежде чем записать его в файловую систему.

В этом ответе о переполнении стека говорится так же. И этот другой ответ объясняет это более красноречиво и лаконично:

Только если вы планируете читать весь файл в память, а файл, который вы читаете, больше, чем пространство, выделенное для PHP (то есть memory_limit), в этом случае вам не хватит памяти.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .