PHP Techniken

Blockieren bei Sessions

Ein interessanter Effekt ergibt sich bei der Verwendung von Sessions in PHP.

Wenn man Code hat wie folgenden:

session_start();
...
$_SESSION['viewpage_stage'] = $mode;
// ... do something which takes a log time
exit;

und man die Seite nun einmal aufruft mit - sagen wir Firefox, passiert folgendes:

Der Webserver startet die Session und fängt an mit "do something which takes a log time". Nun ruft man im selben (!) Browser die Seite nochmal auf, ggf. auch eine andere Seite, die nicht den Code "do something which takes a log time" enthält und schnell angezeigt würde.

ABER:

Da diese Seite die selbe Session verwenden wird, wartet der Webserver bis die erste, langsame Seite fertig ist mit ihren Berechnungen und stellt die zweite in eine Warteschlange. Die Session ist durch den ersten Prozess gesperrt (locked). Das heisst die zweite Seite lädt nicht, irgendwann kommt evtl. ein Timeout (der Server reagiert nicht).

Ruft man diese zweite Seite in einen anderen Browser auf wird sie z.B. in 1/2 Sekunde geladen, da sie hier eine andere Session hat.

Lösung

Die Lösung ist, immer nachdem man Werte in die Session schreibt, ein session_write_close() aufzurufen. Damit wird die Sperrung der Session aufgehoben (unlocked) und ein ggf. zweiter Aufruf der Seite wird sofort abgearbeitet statt in der Warteschlange zu landen. Und die Session wird nicht - wie der Name suggeriert - geschlossen, sondern bleibt offen.

Der Code wäre dann folgender:

session_start();
...
$_SESSION['viewpage_stage'] = $mode;
session_write_close();
// ... do something which takes a log time
exit;

Erstellt: 09/2016| Geändert: 09/2016