Я публикую этот вопрос здесь после видя этот недавний вопрос SuperUser о роли memory_limit
в ограничениях загрузки файлов.
В официальном руководстве по PHP в разделе post_max_size
указано следующее:
Generally speaking,
memory_limit
should be larger thanpost_max_size
.
Если вы понимаете PHP на каком-то уровне и что такое memory_limit
по сравнению с post_max_size
, этот официальный совет не имеет никакого смысла. memory_limit
- это параметр, который касается ограничений памяти процесса PHP, а post_max_size
просто касается максимального размера элементов, загружаемых через PHP в файловую систему.
Теперь, когда разрешено, можно выполнить POST-запрос большого объема в PHP-скрипт и сохранить его в памяти PHP. Но почти никто этого не делает. Когда подавляющее большинство файлов отправляется в сценарий PHP, этот файл передается через PHP и сохраняется в файловой системе.
Так почему же тогда дается этот совет «вообще говоря…»? Или я полностью сбился с пути после более чем 20 лет разработки PHP, и каким-то образом я смог загружать огромные файлы в приложения стека LAMP, не превышая memory_limit
над post_max_size
?
Если обнаружены аналогичный вопрос здесь и этот ответ, а также как этот другой ответ, это подтверждает то, что я говорю. И, черт возьми, вот еще один ответ на другой вопрос, который затрагивает тему, где в ответе четко указано «Нет».
Так почему же тогда в официальном руководстве по PHP говорится, что memory_limit
имеет какое-либо отношение к post_max_size
?
И да, я понимаю, что есть случаи некоторые, в которых этот совет «Вообще говоря…» действителен, но меня сбивает с толку, сколько онлайн-источников (см. Выше) противоречат тому, что сказано в руководстве по PHP. Возможно, этот «общий» совет должен быть более конкретным для разных случаев использования?
Это будет зависеть от того, какие данные публикуются. Если вы не ожидаете загрузки файлов (многие сайты этого не делают), то ограничение post_max_size чем-то, что может полностью уместиться в памяти (например, массив $ _POST), неплохая идея.
Где PHP хранит необработанные данные POST? Он полностью хранится в памяти или записывается в файловую систему?
Потому что, если вы используете массив $_POST
, он должен храниться в памяти, особенно для больших данных POST
. Следовательно, он должен уместиться в памяти.
Вы также можете использовать обертку потока php://input
для уменьшения использования памяти вместо $_POST
.
Спасибо за быстрый ответ! Я отредактировал свой вопрос, чтобы добавить некоторый контекст, но Можете ли вы взглянуть на эту ветку вопросов и ответов 2011 года, чтобы увидеть, откуда я - и другие - исхожу в отношении отношений между memory_limit
и post_max_size
?
Руководство по php правильное. Есть много причин использовать эту структуру. Этот ответ показывает лишь один пример.
@ATechGuy обновит вопрос, чтобы прояснить, но когда он говорит расплывчато и пренебрежительно: «Вообще говоря…» и в Интернете есть масса примеров, которые противоречат тому, что либо данный совет плохой / устаревший, либо аргументация должна быть расширена или разъяснена.
post_max_size
не ограничивается загружаемыми файлами. Что, если по какой-то нечестивой причине ваш сайт имеет форму, которая отправляет 20 МБ текста с<textarea>
на сервер, но ваш лимит памяти составляет 12 МБ?