Auf einer Webseite, für die ich mitverantwortlich bin, ist mir ein Bug aufgefallen: Während ich eine Datei von der Seite heruntergeladen habe (und das kann mit DSL lite dauern), war der Rest der Seite unbenutzbar. Zwar ist die Webseite mit einigen hundert Besuchern im Monat recht klein, aber dass die Seite nicht erreichbar ist, weil jemand eine Datei herunter läd, war kein akzeptabler Zustand.
Letztendlich war das Problem dahinter recht simpel: Der Download lief über den internen, passwortgeschützten Bereich. Und dieser Passwortschutz ist mit PHP-Sessions realisiert. Da eine PHP-Session nicht von mehreren Scripts gleichzeitig genutzt werden kann, mussten die anderen Seitenaufrufe warten, bis der Download abgeschlossen war. Ein Aufruf von session_write_close() im Script, das für die Downloads zuständig ist, löste das Problem.
Nachdem die Ursache bekannt war, war auch klar, dass der Fehler keine Auswirkungen auf den öffentlichen Bereich der Seite hatte. Das Problem betraf nur eingeloggte Benutzer, und jeder Besucher konnte nur sich selbst blockieren.
Es hat mich allerdings einige Zeit gekostet, bis ich den Fehler gefunden hatte. Denn ich konnte den Fehler mit einem Script reproduzieren, das gar keine Sessions verwendet:
<php
header('Content-Type: text/plain');
echo date('r')."\n";
sleep(10);
echo date('r');
?>
Dieses Script gleichzeitig in zwei Firefox-Tabs geladen ergibt folgendes:
Tue, 30 Oct 2012 17:50:14 +0100
Tue, 30 Oct 2012 17:50:24 +0100
und
Tue, 30 Oct 2012 17:50:24 +0100
Tue, 30 Oct 2012 17:50:34 +0100
Das sah nach einem Konfigurationsfehler im Webserver aus. Doch nach einer längeren Fehlersuche auf dem Server brachte schließlich ein lokal laufendes Wireshark Licht ins Dunkel: Die zweite HTTP-Anfrage wurde von Firefox erst abgeschickt, wenn die erste Anfrage abgeschlossen war.
Der Grund hierfür war dann schnell gefunden: Firefox läd die Seite zunächst nur einmal und zeigt sie, falls sie cachebar ist, auch im zweiten Tab an. Erlaubt man das Cachen mit header('Cache-Control: max-age=20')
, dann zeigen beide Tabs das gleiche an – es sei denn, man läd die Seite mit F5 neu. Dann verwendet Firefox nämlich keine Daten aus dem Cache. Mit der zweiten Anfrage wartet er aber trotzdem, bis die erste beendet ist.
Wenn man Firefox dazu bringen möchte, die Seite in zwei Tabs gleichzeitig zu laden, muss man einen kleinen Trick anwenden: Einfach in den beiden Tabs unterschiedliche GET-Parameter verwenden.
veröffentlicht am 01.11.12 um 23:07 Uhr
Tags: Webentwicklung, Computer
Es sind keine Kommentare vorhanden.