Datum: 02.09.2008
, Kategorie:
Kunden,
PHP,
Server
Ein Kunde aus Sydney (Australien) hatte kürzlich Probleme mit seinem Schedule Organizer. Angeblich waren alle bislang reservierten Termine auf einmal verloren gegangen. Vorfälle dieser Art hatten wir bereits dreimal zuvor, aber bislang konnten wir nicht viel dagegen ausrichten. Glücklicherweise handelte es sich jedesmal um ein einmaliges Ereignis und die Kunden konnten damit leben.
Nichtsdestotrotz wurde es Zeit, die Ursache des Problems zu finden und zu eliminieren. Das Gemeine an der Sache war, dass sie nicht durch falsche Einstellungen in der Konfiguration des Scripts hervorgerufen werden konnte. Andernfalls wäre es einfach gewesen, diese abzufangen. Also musste die Schuld irgendwo beim Server liegen.
Nach einigem Testen und Anzeigen aller möglichen Umgebungsvariablen probierten wir es mal mit date_default_timezone_get().
Ergebnis: America/Chicago. Was zum Henker?
Nun ist eine falsche Zeitzone kein Problem, solange sich nichts ändert. Aber genau das ist wohl geschehen, denn eine Änderung der Zeitzoneneinstellung verursacht exakt das oben beschriebene Verhalten. Die Lösung ist date_default_timezone_set(). Danach kann der Provider die Server-Einstellungen ändern wie er möchte, ohne das Script zu beeinflussen. Seit PHP 5.1.0 wird im E_STRICT-Modus sogar davor gewarnt, den Zeitzoneneinstellungen des Servers zu vertrauen. Offensichtlich sind den PHP-Entwicklern die Probleme bekannt.
Aus den reservierten Terminen ließ sich übrigens erkennen, dass sich die Zeitzone des Servers um fünf Stunden verschoben hatte. Chicago und Sydney liegen allerdings acht Stunden auseinander. Die Zeitzoneneinstellungen müssen also schon vorher falsch gewesen sein.