Яка межа розміру запиту на публікацію?


268

Вибачте, якщо це дублікат, я думаю, це було б, але нічого не вдалося знайти.

У мене є програма Flex, що я надсилаю дані на сервер 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, і не можу його знайти ніде в нашій кодовій базі (використовуючи процес пошуку DreamWeaver). Я б запитав наших системних адміністраторів, але вони підлі. :-P
перевернутапоказ

10
Тож ви можете просто встановити це значення будь-якого розміру? Чи не існує жодного виду обмеження протоколу? Чи можете ви встановити його на 99999999999999999999999M?
Para

8
@Para - у цій публікації йдеться про те, що ви можете встановити його так само, як пам'ять вашого пристрою . Там же сказано, що за замовчуванням - 2 Мб.
RustyTheBoyRobot

37
Оскільки це PHP, я начебто очікував, що він прийме будь-яке значення і просто SEGFAULT, коли він досягне межі вашої машини ....
RustyTheBoyRobot

12
Також у файлі PNP.INI є параметр: max_input_vars, який у моїй версії PHP: 5.4.16 за замовчуванням 1000. З посібника: "Скільки змінних вхідних даних може бути прийнято (обмеження застосовується до $ _GET, $ _POST і $ _COOKIE суперглобально окремо) "Ref .: 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. Вище та за межами необхідного та надання корисної довідкової інформації.
Dormouse

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

Як зауважив Девід, у більшості випадків я би йшов із КБ.

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 байт пам'яті. Рядок (технічно це масив char, якщо я не помиляюся) використовує 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.