PHP max_input_vars

PHP max_input_vars

Pentru firma unde lucrez am dezvoltat o aplicatie care permite crearea rapida si usoara a ofertelor de pret pentru clientii nostri. Aplicatia permite introducerea unuia sau a mai multor coduri de produs, apoi interogheaza baza de date SAP si returneaza date despre produse (7 campuri pentru fiecare produs): producator, denumire, pret, stoc disponibil, etc…

Recent, un coleg a avut de facut o oferta care continea aprox 200 de coduri de produs. Dar in urma interogarii erau returnate informatiile doar pentru aprox 160 de produse. Am inceput sa fac tot felul de teste sa vad de unde apare limitarea.

Datele introduse in formular sunt trimise spre server prin jquery.post():

jquery.post(
'ajax.php?',
'cmd=intprice&' + $('#oForm').serialize(),
function (result){ /*do something*/ },
'json'
);

si ma gandeam ca poate exista o limitare a numarului de campuri din formular sau a array-ului care trebuie serializat. Totusi, folosind Developer tools din Google Chrome am observat ca spre server se trimit toate informatiile necesare. Asta inseamna ca problema era undeva pe server.

Am creat un formular cu 500 de elemente, iar pe server am creat un script php care nu facea altceva decat sa afiseze tot ce s-a transmis prin POST:

print "<pre>" . print_r($_POST, true) . "</pre>";

Folosindu-ma tot de Developer tools din Google Chrome am vazut ca erau intoarse toate campurile. Am marit formularul la 1000 de elemente. Rezultatul a fost la fel: au fost intoarse elementele de la 0 la 999. Am marit din nou formularul la 1500 de elemente si aici a fost cheia: din 1500 de elemente a returnat tot 1000 (de la 0 la 999).

Am cautat in setarile din PHP si am gasit parametrul max_input_vars , care, conform manualului PHP (http://www.php.net/manual/ro/info.configuration.php#ini.max-input-vars) limiteaza numarul maxim de variabile de intrare care pot fi acceptate de sistem (limitarea se aplica la $_GET, $_POST si $_COOKIE). Aceasta directiva a fost introdusa ca o masura de securitate. Daca exista mai multe variabile de intrare decat numarul specificat prin directiva max_input_vars  se va genera un E_WARNING, iar variabilele care sunt in plus nu vor fi luate in considerare.

Aceasta directiva a fost introdusa in PHP incepand cu versiunea 5.3.9 (conform http://php.net/manual/ro/info.configuration.php) si poate fi gasita in fisierul php.ini. In versiunile anterioare ale PHP aceasta directiva nu este specificata explicit in fisierul php.ini, totusi se tine cont de ea ca avand valoarea implicita 1000. Daca se doreste modificarea acestei valori trebuie adaugata linia urmatoare in php.ini:

max_input_vars=2000

Solutia la problema intampinata de mine a fost marirea valorii pentru directiva max_input_vars.

Partea pozitiva a acestei directive este faptul ca, desi are o valoare definita in fisierul global de configurare php.ini, ea poate fi modificata la nivel de cont/aplicatie/folder in fisierul php.ini, .htaccess, httpd.conf sau user.ini (incepand cu PHP 5.3). Directiva nu poate fi modificata prin comanda ini_set() .

Pe un server web CentOS cu interfata de management Plesk, fisierul global de configurare PHP se afla in locatia /etc/php.ini , iar fisierele php.ini specifice fiecarui domeniu se afla in locatii de genul /var/www/vhosts/subdomeniu/conf/httpd.include . Pentru a modifica valoarea directivei max_input_vars  la nivelul unui domeniu web din interfata web de administrare, se navigheaza la setarile domeniului -> Websites & Domains -> se alege domeniul -> PHP settings -> Additional configuration directives: max_input_vars = 2000. Dupa salvare modificarea este deja activa.

Leave a Reply

Your email address will not be published. Required fields are marked *