Ты спрашиваешь:
Итак, если вышеприведенное верно, верно ли утверждать, что истинный максимальный размер файла, который можно загрузить на веб-сервер через 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
), в этом случае вам не хватит памяти.