Internal Server Error und maximale Anzahl an Variablen in POST/GET

12 Feb 2012 um 15:49 - PHP

Einige Formulare können plötzlich nicht mehr funktionieren. "Internal Sever Error" in diesem Fall scheint nicht so aussagekräftig zu sein.

In einem Project habe ich ein Formular mit mehreren Unterformularen entwickelt. Eigentlich geht es um eine große Tabelle mit vielen Zeilen. Wenn die Zeile ausgewählt wird, wird das Formular mit von 5 bis 15 Variablen nachgeladen. So kann man alle Zeile anklicken und die Tabelle verwandelt sich in ein extra schweres Formular mit sehr viele Abhängigkeiten etc. Dazu kommt noch die von Kunden gewünschte Möglichkeit, alle Unterformulare mit einem Save-Button zu speichern.

Alles hat einwandfrei funktioniert aber plötzlich tauchen Fehler auf. Die Beschreibung sagt uns nicht so viel: Internal Server Error (von Apache). Der Fehler war schen zu reproduzieren, mal hat es funktioniert, mal nicht mehr... 

Klar geht es in diesem Fall nicht um die reine PHP-Programmierung, die eindeutig doch funktioniert. Aber Apache noch vor PHP kann etwas nicht bearbeiten. Früher hatte ich schon was Ähnliches, damals ging es um die Länge der mit GET versendeten Daten (QUERY_STRING). Hier lag die Größe der Daten verdächtig nah zu 16Kb :)

Dann beim Testen wurde noch eine komische Kombination gefunden: wenn man im Formular eine Checkbox auswählt, dann funktioniert es plötzlich nicht mehr. Ohne Checkbox klappt alles. Die Antwort war sofort klar: die ausgewählten Checkboxes werden mit POST/GET versendet, sonst - nicht.

Mit jQuery wurde dann sofort die Anzahl der versendeten Variablen berechnet:

 $("input[type='checkbox']:checked").length + //Checkboxes :)
$("select, input[type='text']").length + //Selects und Textfelder
$("input[type='hidden']").length + //versteckte Felder
$("textarea, input[type='radio']:checked").length = 1000 //Radios und Textareas
P.S. Ja, mann kan auch alles in einem schreiben

Das Ergebnis war gerade 1000 Variablen :) Damit was alles klar, wo man weiter suchen sollte. Mit phpinfo() wurde die PHP-Konfiguration analysiert. Da stand bisher unbekannt Einstellung "max_input_vars=1000". Internet hat uns noch andere Variablen angezeigt, die dafür verantwortlich sein können: suhosin.post.max_vars, suhosin.request.max_vars etc.

Mit ini_set() kann man diese Variablen nicht überschreiben, weil zuerst Apache ins Spiel kommt und nur dann PHP selbst. Meistens kann man alle Variablen aus php.ini oder httpd.conf in .httaccess-Datei überschreiben. Das ist in diesem Fall einzige Lösung, wenn man keinen direkten Zugriff auf Einstellungsdateien hat.

Nach dem folgenden Eintrag in .httaccess hat alles wieder funktioniert:

 php_value max_input_vars 2000

Keine richtige Lösung alle Einstellungen hier noch mal zu definieren. Aber die Frage blieb, warum es früher funktioniert hat. Support konnte der Fehler nicht reproduzieren und es war klar. Der direkte Anruf an Hostinganbieter hat geholfen: es sei wahrscheinlich einige Updates von PHP durchgeführt worden, die aus Sicherheitsgründen diese Variablen fest definiert haben. Gut zu wissen :) Klar, merkt man diese Änderung nicht gleich: wer speichert schon mehr als 1000 Variablen?

Der Fall geklärt, aber... PHP bzw. Apache kann sich selbst nicht aktualisieren und das macht Hostingprovider. Zu jedem Update gibt es eine detaillierte Beschreibung und man kann diese Beschreibung zumindest veröffentlichen, damit Kunden die Information hätten, was sich in letzter Zeit geändert hat.

Gut, dass ich das sofort gefunden hat, aber solche unerwartete Änderung kann einige Projekte lahm legen... Gut, wenn Du informiert bist, sonst musst Du forschen :)

Kommentare (2)

hetzner hat geschrieben am 13 Sep 2012 um 00:16
±0

Neue Server? nicht mehr bei 1und1? Gute Lösung!

Anton Pavlushko hat geschrieben am 20 Oct 2012 um 19:05
±0

Tja, 1und1 scheint heutzutage übertrieben teuer zu sein


© 2008 Anton Pavlushko - Webentwicklung, Internetmarketing und Suchmaschinenoptimierung (SEO)

0.0075039863586426 sec