Bir gönderi isteğinin boyut sınırı nedir?


268

Üzgünüm, bu yineleniyorsa, olacağını düşünürdüm ama bir şey bulamadım.

IE üzerinden bir php / mysql sunucusuna veri gönderiyorum esnek bir uygulama var. Henüz herhangi bir sorunla karşılaşmadım, ama bunu önceden bilmek beni bir sürü hayal kırıklığı ve işten kurtarabilir. Http yoluyla veri yayınlamak için bir boyut sınırı var mı?

Bu makale hayır diyor: http://www.netlobo.com/ie_form_submit.html

Bu tartışma evet diyor: http://bytes.com/topic/php/answers/538226-what-maximum-limit-using-post-method

Ve çevrimiçi olarak bulabildiğim her şey ileri geri gidiyor. Yani lütfen şahsen test / doğrulanmış numaralara sınır cevapları.

Ben oldukça büyük bir XML dizesi (5mb kadar söylemek) geri göndermek istiyorum.

Herhangi bir fark yaratırsa: tarayıcı her zaman IE (ürünümüz gerektirir), yazı geliyor ve httpService flex, web sunucusu php, DB mySql.


Yanıtlar:


203

Bir sunucu yapılandırmasına bağlıdır. PHP veya Linux altında PHP ile çalışıyorsanız .htaccess yapılandırma dosyasını kullanarak kontrol edebilirsiniz, örneğin:

#set max post size
php_value post_max_size 20M

Ve evet, bunun işe yaradığını kişisel olarak kanıtlayabilirim :)

IIS kullanıyorsanız, bu değeri nasıl ayarlayacağınız hakkında hiçbir fikrim yok.


3
Bu post_max_sizeayar nerede ? Ben php için yeniyim ve kod tabanımızın herhangi bir yerinde bulamıyorum (dreamWeaver find-all sürecini kullanarak). Sys yöneticilerimize sormak istiyorum ama onlar demek. :-P
invertedSpear

10
Peki bu değeri istediğiniz boyuta ayarlayabilir misiniz? Herhangi bir protokol sınırlaması yok mu? 999999999999999999999M olarak ayarlayabilir misiniz?
Para

8
@Para - Bu yazı , makinenizin belleği kadar yükseğe ayarlayabileceğinizi söylüyor. Ayrıca varsayılan 2MB olduğunu söylüyor.
RustyTheBoyRobot

37
Bu PHP olduğu için, herhangi bir değeri kabul etmesini bekliyordum ve makinenizin sınırına ulaştığında sadece SEGFAULT ....
RustyTheBoyRobot 19:12

12
Ayrıca, PNP.INI dosyasında bir ayar vardır: max_input_vars PHP sürümümde: 5.4.16 varsayılan olarak 1000'dir. $ _COOKIE superglobal ayrı ayrı) "Ref .: php.net/manual/tr/info.configuration.php#ini.max-input-vars
Nikolay Ivanov

73

Bir isteğin url kısmı (GET ve POST) hem tarayıcı hem de sunucu tarafından sınırlandırılabilir - daha küçük bir sınır kullanan neredeyse hiç tarayıcı veya sunucu olmadığından genellikle güvenli boyut 2 KB'dir.

Bir istek gövdesi (POST) normalde sunucu tarafından bayt boyutu bazında * sınırlıdır, bu da bir tür DoS saldırısını önlemek için (bunun karakter kaçışının gövdenin bayt boyutunu artırabileceği anlamına gelir). En yaygın sunucu ayarı 10 MB'dir, ancak tüm popüler sunucular bunun bir ayar dosyası veya panel aracılığıyla artırılmasına veya azaltılmasına izin verir.

* Eski cep telefonu veya diğer küçük cihaz tarayıcılarında bazı istisnalar vardır - bu gibi durumlarda daha çok cihazda bu amaç için ayrılmış yığın alanının bir işlevi daha sonra başka bir şeydir.


2
Tarayıcı sınırları hakkında bir şeyler anlatıncurl
Yugal Jindle

12
Buradaki zamanların biraz gerisinde olduğumu biliyorum ama bunlar gibi cevaplar StackOverflow'u sevmem nedenidir. Gerekli olanın üzerinde ve ötesinde ve değerli arka plan bilgileri sağlar.
Dormouse


14

Php.ini değişkenini ayarlayarak büyük miktarda veri gönderebilirsiniz: max_input_vars Bu değişkenin varsayılan boyutu 1000'dir, ancak büyük miktarda veri göndermek istiyorsanız boyutu buna göre arttırmanız gerekir. Boyutu ini_set'ten ayarlayamıyorsanız, bunu doğrudan htaccessveya php.ini dosyasında değişiklik yaparak yapmanız gerekir .

max_input_vars  2500
memory_limit    256M

5

David'in işaret ettiği gibi, çoğu durumda KB ile giderdim.

php_value post_max_size 2KB

Not: Formum basit, sadece birkaç metin kutusu, uzun metin değil.


2

Varsayılan olarak, gönderi isteğinin boyutu en fazla 8mb'dir. Ancak ihtiyaçlarınıza göre değiştirebilirsiniz. Değişiklik php.ini dosyası açılarak yapılabilir (php yapılandırma ayarı).

bulmak

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

8 değiştirin ihtiyaçlarına göre.



1

Bunun için en iyi çözümlerden biri, birden fazla veya 1000'den fazla giriş alanı kullanmazsınız. Birden fazla girişi herhangi bir özel karakterle birleştirebilirsiniz, örn. @.

Bunu gör:

<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'>

Herhangi bir komut dosyasını (JavaScript veya JScript) kullanma,

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

Bununla, max_input_varssorunu atlayacaksınız . max_input_varsPhp.ini dosyasında artış , daha fazla sunucu önbellek kullandığından sunucu için zararlıdır ve bu bazen sunucuyu çökmesine neden olabilir.


1
Değişkenleri birleştirmenin belleği nasıl kurtardığını görmüyorum. Her ASCII Karakteri 1 bayt bellek kullanır. Bir dize (teknik olarak bir char dizisi yanılmıyorsam), dize uzunluğu olarak n ile n * 1 bayt kullanır. Neden başka bir karakter eklemek kullanılan belleği azaltır? Bu hesaplamada, dizeye eklediğiniz her '@' için başka bir bayt eklersiniz. Tabii ki kullanılan değişkenlerin sayısını azaltırsınız, ancak bu "kazanma" yı, onları tekrar bölerek ekstra çalışma ile ödersiniz.
DBX12

2
@ DBX12 Bu hile ile bellek kaydetmezken max_input_vars, php.inibununla seçeneği atlayabilirsiniz . Tam olarak değil, sorulan, ancak yine de yararlı.
RicoBrassers

Boyut sınırı iki faktöre bağlıdır: birincisi, ayrı anahtar / değer dizesi boyutunun boyutu, yani anahtar ve / veya değer tarafındaki karakter sayısı. ikincisi, anahtar / değer çifti miktarı, her çiftte küçük karakter miktarı olsa bile. Genel olarak yukarıdaki iki faktör boyut sınırını aşmaktadır. Yani, bana göre, bu cevap doğru ve soru ile ilgilidir ve bir sorunun bir tarafını vurgular.
Elnur Shabanov

0

Webhosting nedeniyle php yapılandırmasını değiştiremeyen geliştiriciler için. (Ayarlarım 256 MB maksimum boyut, 1000 maksimum değişken)

Ben sunucu tarafında alt yapıları ile 5 büyük veri nesnelerinin (ilişkilendirilebilir diziler) sadece 2 alınan aynı sorunu var.

Tüm alt yapının posta talebinde "düzleştirildiğini" öğrendim. Böylece, bir nesne yüzlerce değişmez değişken haline gelir. Sonunda, 5 Nesne değişkeni yerine gerçekte yüzlerce elementar değişken gönderiyor.

Bu durumda çözüm , alt yapıların her birini String olarak serileştirmektir . Sonra sunucuda 5 String değişkeni olarak alınır. Misal: {variable1:JSON.stringify(myDataObject1),variable2:JSON.stringify(myDataObject2)...}

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.