Каков предел размера почтового запроса?


268

Извините, если это дубликат, я думаю, что это будет, но ничего не смог найти.

У меня есть гибкое приложение, которое я отправляю данные обратно на сервер php / mysql через IE. Я еще не сталкивался с какими-либо проблемами, но знание этого заранее может спасти меня от разочарования и работы. Существует ли ограничение на размер размещения данных через http?

Эта статья говорит нет: http://www.netlobo.com/ie_form_submit.html

Это обсуждение говорит да: http://bytes.com/topic/php/answers/538226-what-maximum-limit-using-post-method

И все это говорит о том, что я могу найти в Интернете. Поэтому, пожалуйста, ограничьте ответы лично проверенными / проверенными номерами.

Я хочу отправить обратно строку XML, которая может быть довольно большой (скажем, до 5 МБ).

Если это имеет какое-либо значение: браузер всегда будет IE (наш продукт требует этого), отправка сообщения и httpService на flex, веб-сервер php, DB mySql.


Ответы:


203

Это зависит от конфигурации сервера. Если вы работаете с PHP под Linux или подобным, вы можете управлять им с помощью файла конфигурации .htaccess, например так:

#set max post size
php_value post_max_size 20M

И, да, я могу лично подтвердить тот факт, что это работает :)

Если вы используете IIS, я понятия не имею, как вы установите это конкретное значение.


3
Где находится этот post_max_sizeпараметр? Я довольно новичок в php и не могу найти его нигде в нашей кодовой базе (используя процесс поиска все для мечты). Я бы спросил наших системных администраторов, но они злые. :-P
invertedSpear

10
Так вы можете просто установить это значение на любой размер? Нет ли каких-либо ограничений протокола? Вы можете установить его на 999999999999999999999M?
Пара

8
@Para - в этом сообщении говорится, что вы можете установить его так же высоко, как память вашей машины. Это также говорит, что по умолчанию 2 МБ.
RustyTheBoyRobot

37
Поскольку это PHP, я ожидал, что он примет любое значение и просто SEGFAULT, когда он достигнет предела вашей машины ....
RustyTheBoyRobot

12
Кроме того, в файле PNP.INI есть настройка: max_input_vars, которая в моей версии PHP: 5.4.16 по умолчанию равна 1000. Из руководства: «Сколько входных переменных может быть принято (ограничение применяется к $ _GET, $ _POST и $ _COOKIE отдельно) (ссылка: php.net/manual/en/info.configuration.php#ini.max-input-vars
Николай Иванов

73

URL-часть запроса (GET и POST) может быть ограничена как браузером, так и сервером - обычно безопасный размер составляет 2 КБ, поскольку практически нет браузеров или серверов, которые используют меньший лимит.

Тело запроса (POST) обычно * ограничено сервером на основе размера байта, чтобы предотвратить тип атаки DoS (обратите внимание, что это означает, что экранирование символов может увеличить размер байта тела). Наиболее распространенная настройка сервера - 10 МБ, хотя все популярные серверы позволяют увеличивать или уменьшать ее с помощью файла настроек или панели.

* Существуют некоторые исключения для старых мобильных телефонов или других небольших браузеров устройств - в этих случаях это скорее функция кучи, зарезервированной для этой цели на устройстве, чем что-либо еще.


2
Расскажите что-нибудь об ограничениях браузера, учитываяcurl
Yugal Jindle

12
Я знаю, что я немного отстал здесь, но такие ответы - вот причина, по которой я люблю StackOverflow. Помимо того, что требуется, и предоставление некоторой ценной справочной информации.
Соня

50

Также в файле PHP.INI есть настройка:

max_input_vars

который в моей версии PHP: 5.4.16 по умолчанию 1000.

Из руководства: «Сколько входных переменных может быть принято (ограничение применяется к суперглобальным $ _GET, $ _POST и $ _COOKIE отдельно)»

Ссылка: http://www.php.net/manual/en/info.configuration.php#ini.max-input-vars


14

Вы можете опубликовать большой объем данных, установив переменную php.ini: max_input_vars размер этой переменной по умолчанию равен 1000, но если вы хотите отправить большой объем данных, вы должны соответственно увеличить размер. Если вы не можете установить размер из ini_set, вы должны сделать это с помощью htaccessили внести изменения в файл php.ini напрямую.

max_input_vars  2500
memory_limit    256M

5

Как отметил Дэвид, я бы пошел с KB в большинстве случаев.

php_value post_max_size 2KB

Примечание: моя форма проста, всего несколько текстовых полей, а не длинный текст.


2

По умолчанию максимальный размер почтового запроса составляет 8 МБ. Но вы можете изменить его в соответствии с вашими требованиями. Изменение можно сделать, открыв файл php.ini (настройка конфигурации php).

найти

post_max_size=8M  //for me, that was on line:771

заменить 8 в соответствии с вашими требованиями.


1

Сервер http решает, есть ли ограничение. Продукт, над которым я работаю, позволяет администратору настроить ограничение.


Кроме того, в файле PNP.INI есть настройка: max_input_vars, которая в моей версии PHP: 5.4.16 по умолчанию равна 1000. Из руководства: «Сколько входных переменных может быть принято (ограничение применяется к $ _GET, $ _POST и $ _COOKIE отдельно) (ссылка: [ php.net/manual/en/info.configuration.php#ini.max-input-vars][1] [1]: php.net/manual/en/info.configuration .php # ini.max-input-vars
Николай Иванов

1

Одно из лучших решений для этого - не использовать несколько или более 1000 полей ввода. Вы можете объединить несколько входов с любым специальным символом, например. @,

Посмотри это:

<input type='text' name='hs1' id='hs1'>
<input type='text' name='hs2' id='hs2'>
<input type='text' name='hs3' id='hs3'>
<input type='text' name='hs4' id='hs4'>
<input type='text' name='hs5' id='hs5'>

<input type='hidden' name='hd' id='hd'>

Используя любой скрипт (JavaScript или JScript),

document.getElementById("hd").value = document.getElementById("hs1").value+"@"+document.getElementById("hs2").value+"@"+document.getElementById("hs3").value+"@"+document.getElementById("hs4").value+"@"+document.getElementById("hs5").value

С этим вы обойдете max_input_varsпроблему. Если вы увеличите max_input_varsразмер файла php.ini, это будет вредно для сервера, поскольку он использует больше кэш-памяти сервера, что иногда может привести к сбою сервера.


1
Я не вижу, как объединение переменных экономит память. Каждый ASCII-символ использует 1 байт памяти. Строка (технически массив символов, если я не ошибаюсь) использует n * 1 байт с n в качестве длины строки. Почему добавление другого символа уменьшает объем используемой памяти? В этом расчете вы добавляете еще один байт для каждого '@', который вы добавляете в строку. Конечно, вы уменьшаете количество используемых переменных, но вы платите за этот «выигрыш» дополнительной работой, разделяющей их снова.
DBX12

2
@ DBX12 Несмотря на то, что вы не экономите память с помощью этого трюка, вы можете обойти max_input_varsопцию в php.iniс этим. Не совсем то, о чем спрашивали, но все же полезно.
RicoBrassers

Превышение предела размера зависит от двух факторов: во-первых, от размера отдельного ключа / строки значения, то есть от количества символов в ключе и / или на стороне значения. во-вторых, количество пар ключ / значение, даже если каждая пара имеет небольшое количество символов. В целом два вышеперечисленных фактора заканчиваются тем, что ограничение размера превышает проблему. Таким образом, для меня этот ответ является правильным и связан с вопросом и подчеркивает одну сторону проблемы.
Эльнур Шабанов

0

Для разработчиков, которые не могут изменить конфигурацию php из-за веб-хостинга. (Мои настройки максимальный размер 256 МБ, 1000 переменных)

У меня возникла та же проблема, что только 2 из 5 больших объектов данных (ассоциативных массивов) с подструктурами были получены на стороне сервера.

Я обнаружил, что вся подструктура "сплющена" в почтовом запросе. Итак, один объект становится сотнями литеральных переменных. В конце концов, вместо 5 переменных объекта в действительности он отправляет десятки сотен элементарных переменных.

Решением в этом случае является сериализация каждой из подструктур в String. Тогда это получено на сервере как 5 Строковых переменных. Пример: {variable1:JSON.stringify(myDataObject1),variable2:JSON.stringify(myDataObject2)...}

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.