Qual è il limite di dimensione di una richiesta di post?


268

Scusate se questo è duplicato, penso che lo sarebbe, ma non sono riuscito a trovare nulla.

Ho un'applicazione flessibile che sto inviando i dati a un server php / mysql tramite IE. Non ho ancora riscontrato alcun problema, ma conoscerlo in anticipo potrebbe risparmiarmi un sacco di frustrazione e lavoro. Esiste un limite di dimensioni per la pubblicazione di dati tramite http?

Questo articolo dice di no: http://www.netlobo.com/ie_form_submit.html

Questa discussione dice di sì: http://bytes.com/topic/php/answers/538226-what-ma maximum - limit - using - post - method

E tutto va avanti e indietro quello che sono in grado di trovare online. Pertanto , limitare le risposte ai numeri testati / verificati personalmente.

Voglio rinviare una stringa XML che può essere abbastanza grande (diciamo fino a 5mb).

Se fa la differenza: il browser sarà sempre IE (il nostro prodotto lo richiede), la posta proviene e httpService in flex, il web server è php, DB è mySql.


Risposte:


203

Dipende da una configurazione del server. Se lavori con PHP sotto Linux o simili, puoi controllarlo usando il file di configurazione .htaccess, in questo modo:

#set max post size
php_value post_max_size 20M

E, sì, posso attestare personalmente che funziona :)

Se stai usando IIS, non ho idea di come avresti impostato questo particolare valore.


3
Dov'è questa post_max_sizeimpostazione? Sono piuttosto nuovo di php e non riesco a trovarlo da nessuna parte nella nostra base di codice (usando il processo find-all di dreamWeaver). Chiederei ai nostri amministratori di sistema ma sono cattivi. :-P
invertito

10
Quindi puoi semplicemente impostare questo valore su qualsiasi dimensione? Non esiste alcun tipo di limitazione del protocollo? Puoi impostarlo su 999999999999999999999M?
Para,

8
@Para - Questo post dice che puoi impostarlo su quanto la memoria della tua macchina. Dice anche che il valore predefinito è 2 MB.
RustyTheBoyRobot,

37
Dato che si tratta di PHP, mi aspettavo che accettasse qualsiasi valore e SEGFAULT quando raggiungesse il limite della tua macchina ....
RustyTheBoyRobot

12
Inoltre, nel file PNP.INI c'è un'impostazione: max_input_vars che nella mia versione di PHP: 5.4.16 viene impostato automaticamente su 1000. Dal manuale: "Quante variabili di input possono essere accettate (il limite viene applicato a $ _GET, $ _POST e $ _COOKIE superglobal separatamente) "Ref .: php.net/manual/en/info.configuration.php#ini.max-input-vars
Nikolay Ivanov

73

La parte dell'URL di una richiesta (GET e POST) può essere limitata sia dal browser che dal server, in genere la dimensione di sicurezza è di 2 KB poiché non ci sono quasi browser o server che utilizzano un limite inferiore.

Il corpo di una richiesta (POST) è normalmente * limitato dal server in base alla dimensione in byte al fine di prevenire un tipo di attacco DoS (si noti che ciò significa che la fuga di caratteri può aumentare la dimensione in byte del corpo). L'impostazione del server più comune è 10 MB, sebbene tutti i server più diffusi consentano di aumentarlo o ridurlo tramite un file di impostazione o un pannello.

* Esistono alcune eccezioni con i telefoni cellulari più vecchi o altri browser di dispositivi di piccole dimensioni - in quei casi è più una funzione dello spazio heap riservato a questo scopo sul dispositivo che altro.


2
Racconta qualcosa sui limiti del browser, considerandocurl
Yugal Jindle,

12
So di essere un po 'indietro rispetto ai tempi qui, ma risposte come queste sono la ragione per cui amo StackOverflow. Al di là di ciò che è richiesto e fornendo alcune preziose informazioni di base.
Dormouse,


14

È possibile pubblicare grandi quantità di dati impostando la variabile php.ini: la max_input_vars dimensione predefinita di questa variabile è 1000 ma se si desidera inviare una grande quantità di dati, è necessario aumentare le dimensioni di conseguenza. Se non riesci a impostare la dimensione da ini_set devi farlo attraverso htaccesso modificando direttamente il file php.ini.

max_input_vars  2500
memory_limit    256M

5

Come ha sottolineato David, nella maggior parte dei casi andrei con KB.

php_value post_max_size 2KB

Nota: il mio modulo è semplice, solo alcune caselle di testo, non un testo lungo.


2

Per impostazione predefinita, la richiesta di post ha una dimensione massima di 8 MB. Ma puoi modificarlo in base alle tue esigenze. La modifica può essere effettuata aprendo il file php.ini (impostazione di configurazione php).

Trova

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

sostituire 8 in base alle proprie esigenze.


1

Spetta al server http decidere se esiste un limite. Il prodotto su cui lavoro consente all'amministratore di configurare il limite.


Inoltre, nel file PNP.INI c'è un'impostazione: max_input_vars che nella mia versione di PHP: 5.4.16 viene impostato automaticamente su 1000. Dal manuale: "Quante variabili di input possono essere accettate (il limite viene applicato a $ _GET, $ _POST e $ _COOKIE superglobal separatamente) "Ref .: [ php.net/manual/en/info.configuration.php#ini.max-input-vars[[1] [1]: php.net/manual/en/info.configuration .php # ini.max-input-vars
Nikolay Ivanov

1

Una delle migliori soluzioni per questo, non si utilizzano più o più di 1.000 campi di input. Puoi concatenare più input con qualsiasi carattere speciale, ad es. @.

Guarda questo:

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

Utilizzando qualsiasi script (JavaScript o 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

Con questo, aggirerai il max_input_varsproblema. Se si aumenta max_input_varsil file php.ini, ciò è dannoso per il server perché utilizza più memoria cache del server e questo a volte può causare l'arresto anomalo del server.


1
Non vedo come le variabili concatenate risparmino memoria. Ogni carattere ASCII utilizza 1 byte di memoria. Una stringa (tecnicamente un array di caratteri se non sbaglio) utilizza n * 1 byte con n come lunghezza della stringa. Perché l'aggiunta di un altro personaggio ridurrebbe la memoria utilizzata? In questo calcolo aggiungerai un altro byte per ogni "@" che aggiungi alla stringa. Ovviamente riduci il conteggio delle variabili utilizzate ma paghi questa "vincita" con il lavoro extra che le divide nuovamente.
DBX12

2
@ DBX12 Anche se non si risparmia memoria con questo trucco, è possibile ignorare l' max_input_varsopzione php.inicon questo. Non esattamente, ciò che è stato chiesto, ma comunque utile.
RicoBrassers

Il limite di dimensione supera dipende da due fattori: primo, la dimensione della singola chiave / dimensione della stringa del valore, ovvero il conteggio dei caratteri nella chiave e / o il lato del valore. secondo, la quantità di coppie chiave / valore, anche se ogni coppia ha una piccola quantità di caratteri. Complessivamente due fattori sopra elencati finiscono con il limite di dimensioni superano il problema. Quindi, per me, questa risposta è corretta e correlata alla domanda ed evidenzia un lato di un problema.
Elnur Shabanov,

0

Per gli sviluppatori che non possono modificare la configurazione di php a causa del webhosting. (Le mie impostazioni 256 MB di dimensione massima, 1000 variabili di massimo)

Ho avuto lo stesso problema che solo 2 oggetti su 5 big data (array associativi) con sottostrutture sono stati ricevuti sul lato server.

Scopro che l'intera sottostruttura viene "appiattita" nella richiesta post. Quindi, un oggetto diventa centinaia di variabili letterali. Alla fine, invece di 5 variabili oggetto, in realtà invia decine di centinaia di variabili elementari.

La soluzione in questo caso è serializzare ciascuna delle sottostrutture in String. Quindi viene ricevuto sul server come variabili a 5 stringhe. Esempio: {variable1:JSON.stringify(myDataObject1),variable2:JSON.stringify(myDataObject2)...}

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.