Intereting Posts
Как установить имя хоста с помощью php curl для определенного ip CakePHP – тайм-аут сеанса чрезмерное urlencoding функции http_build_query пустая веб-страница с d3.json (bardata.php), но работает с d3.json (bardata.json) Вызов Perl-скрипта из PHP и передача в переменных, а также использование имени переменной perl-скрипта Пользовательская страница в Prestashop 1.6 без CMS Насколько безопасны переменные сеанса PHP? php – simpleXML Как получить доступ к определенному элементу с тем же именем, что и другие? Сортировка элементов массива в PHP, чтобы он не учитывал регистр букв Ошибка session_start (): open (/ var / lib / php / session error Получите ответ от сервера в формате JSON без использования базы данных? Проблема с эскизом сообщения WordPress (только 1 миниатюра на главной странице) Codeigniter: почта SMTP не работает Как проверить работу cron на локальном сервере, например WAMP? Отправка ответа на кодирование в json

Связь между php memory_limit, upload_max_filesize и post_max_filesize

Нижняя линия :
Мне нужно беспокоиться о настройке post_max_filesize >> memory_limit ?

Детали :
Этот ответ предполагает, что загруженные файлы не должны вписываться в файл памяти php. Документы php предполагают, что весь пост должен соответствовать пределу памяти php.

Я нахожу, что эти документы удивительны, и я надеюсь, что кто-то сможет разработать. Например, выполните следующие конфигурации php:

 ; config A memory_limit = 50M upload_max_filesize = 100M post_max_filesize = 1000M max_file_uploads = 10 

а также

 ; config B memory_limit = 50M upload_max_filesize = 10M post_max_filesize = 1000M max_file_uploads = 100 

С этими конфигурациями я ожидаю, что смогу:

  • загружать файлы 10x100mb на сервер A ,
  • и 100x10mb файлов на сервер B.

Я также ожидал бы, что:

  • Работа с любым из 10 файлов, загруженных на сервер A, является проблемой (100Ms файла в сумке 50M …).
  • Работа с любыми 1 из 100 файлов, загруженных на сервер B, в порядке (10 <50).

Экспериментируя с менее круглыми, но эквивалентно связанными числами, я нашел эти ожидания справедливыми.

Этот опыт заставил бы меня сказать, что «как правило, memory_limit должен быть больше, чем upload_max_filesize »; вместо этого, php docs говорят:

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

Почему и что происходит, если это не так?

Когда мой PHP-код выполняется, я не вижу никаких доказательств того, что все опубликованные файлы находятся в памяти. Мне кажется, что все, что у меня есть, представляет собой массив путей $ _FILES для файлов, найденных исключительно на диске. Является ли php удерживанием всего сообщения в памяти в какой-то момент до моей способности исследовать окружающую среду? Мне нужно беспокоиться о настройке post_max_filesize >> memory_limit ?

В стороне:
Нарушение правила руководства не приводит к грубо разбитому серверу (w / php5.3 apache2.2 debian 6).

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

Следующая конфигурация работает как с модулем Apache2, так и с CGI и принимает файлы размером менее 1G.

  upload_max_filesize = 1G post_max_size = 1G memory_limit = 32M 

Мне нужно беспокоиться о настройке post_max_filesize >> memory_limit?

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

Мой личный опыт заключается в том, что вы должны иметь memory_limit выше, чем post_max_size и upload_max_size.

Значение post_max_size относится ко всей полноте данных POSTed. Сюда входят любые поля формы, которые могут быть включены в файл. Upload_max_size – это самый большой допустимый размер файла, который может находиться в этой загрузке.

Например. с post_max_size 10mb и upload_max_size 1mb, вы можете загрузить 9 файлов, каждый размером 1 МБ, Почему 9 файлов? потому что часть данных POST – это метаданные файла – имя файла, mimetype, размер файла и т. д. Это занимает некоторое место, поэтому ваши 9 файлов будут занимать соответственно 9,01 мегабайта. Оставшееся 0.99 слишком мало для другого файла, поэтому вы не можете загрузить это 10-е, даже если оно соответствует пределу upload_max_size.

Что касается memory_limit, вам не нужно иметь достаточно «комнаты» для загруженных файлов, вы должны помнить, что этот предел применим к сценарию в целом. Memory_limit из 10mb позволит загружать только файл размером 9 мегабайт, поскольку сам PHP и все связанные с ним коды и библиотеки будут всасывать (скажем) 1 мегабайт.

Несмотря на то, что файлы не хранятся в памяти – они как можно скорее выгружаются в временные файлы, они передаются в PHP из Apache через STDIN. PHP должен читать файлы из этого потока и копировать их во временные файлы, которые вы используете в разделе ['tmp_name'] массива $ _FILES.

По какой-то причине PHP, по-видимому, в основном делает «file_get_contents ()» и разрывает файлы навалом, вместо того, чтобы делать копию потокового типа. Следовательно, требуется memory_limit, который превышает максимально допустимый размер файла.