PHP Session wird (anscheinend) nicht dauerhaft über Aufruf hinweg gespeichert

PHP Session

Das war mal wieder so ein Fehler an dem man Tage verbringen kann... zum Glück aber nicht!

Ich arbeite derzeit mit einer Open Source Lib zur Generierung von Formularen. Darauf werde ich hier nicht weiter eingehen, da es im Grunde nebensächlich ist. Dennoch trat hier ein alter bekannter Fehler auf.

Die PHP Session Werte wurden (anscheinend) nicht über den Seitenaufruf hinweg gespeichert!

Der Code um den es geht sieht also abstrahiert so aus:

  1. $_SESSION['key'] = 'value';
  2.  
  3. // ... weiterer Code ...
  4.  
  5. $dummy = $_SESSION['key']; //Hier funktioniert noch alles! Der Wert ist korrekt mit 'value' belegt.

Nun gab es eine weitere Seite, die auf den gesetzten Wert zurückgreifen muss. Diese besaß jedoch kein vollständiges Bootstrap, es handelte sich um eine Erzeugungsroutine für Captcha-Bilder.

An dieser Stelle wollen wir auch nicht weiter Kritik an der Sauberkeit der Lib üben, sondern sie als gegeben betrachten.

Sie enthielt also den folgenden (wieder abstrahierten) Code für den zweiten Aufruf:

  1. // ... Code
  2.  
  3. function validate($key){
  4.   if($_SESSION['key'] == $key){
  5.     return true;
  6.   }
  7. }
  8.  
  9. // ... noch mehr Code

Großartig, der Key war nie in der PHP Session zu finden. Wundersamer weise war die Session aber sogar noch mit anderen Werten gefüllt!

Also was war los?

Des Rätsels Lösung!
Grund für die Probleme ist, dass in der Auswertung, also beim reinen lesen der PHP Session kein  session_start(); ausgeführt wurde.

Die Session wurde in diesem Aufruf also anscheinend nicht wieder korrekt "abgerufen".
Um das Problem zu beheben, musste nur zu Beginn erneut ein  session_start(); ergänzt werden und schon funktionierte alles wie erwartet.

Ich hoffe der Tipp hilft vielleicht dem ein oder anderen, dem dieses Problem auch unterläuft.

Einordnung:

Kommentare

Ja, muss man hat wissen.

Ja, muss man hat wissen. Alternativ kann man auch (je nach Projekt) immer eine Session per php.ini registrieren.

Tja, das liegt daran, dass

Tja, das liegt daran, dass PHP eine Scriptsprache ist. Bei jedem klick wird und muss alles nochmals durchlaufen werden. Das gilt vor allem bei der Arbeit mit SESSIONS...

Vollkommen richtig. Nur fies

Vollkommen richtig. Nur fies diese Fehler zu finden im fremden Code leider Wink

Im Prinzip ist es aber sehr

Im Prinzip ist es aber sehr sinnig, denn Sessions zu erzeugen bzw. auszulesen kann unter Last ein echtes Problem werden. Deshalb würde ich auch niemals empfehlen den Standard Session Handler (als file), sondern direkt memcache zu nehmen. Smile

Korrekt, das kann ich

Korrekt, das kann ich bestätigen. Gerade bei hoher Last ist der Unterschied schon merklich.

Memcached

Prinzipiell stimme ich euch natürlich zu was memcached als Session Handler angeht. Allerdings kann das unter Last und wenn man AJAX verwendet auch interessante Probleme herbeiführen, denn der eingebaute File-Handler von PHP kümmert sich um das Locking, damit keine Race Condition auftritt und Session-Daten verloren gehen. Eine ausführliche Anleitung dazu gibt es hier:
http://thwartedefforts.org/2006/11/11/race-conditions-with-ajax-and-php-...

Nahezu alle selbst gebauten Session-Handler und auch ältere Extensions (siehe unten memcache) haben dieses Problem.

Man sollte also tunlichst darauf achten die neuesten Versionen zu verwenden:
memcache Extension ab Version 3.0.4
http://pecl.php.net/package-changelog.php?package=memcache
oder gleich die memcached Extension, die kann das schon recht lange, man kann dort auch die Expiration Time usw einstellen, siehe
http://de2.php.net/manual/en/memcached.sessions.php#91153

Hallo Michael! Wenn wir schon

Hallo Michael! Wenn wir schon mal dabei sind, auch die Sicherheit nicht vernachlässigen. Wink

Klick!

Euch allen ein großes

Euch allen ein großes Dankeschön für diese super Info + Linksammlung. Da haben wir ja zu einem zugegeben stumpfen Beitrag (aber wie wir wissen sind es oft diese Punkte, die einem die Nerven rauben und viel Zeit kosten!!) wirklich einige nützliche Informationen zusammen bekommen.

Vielen Dank dafür!

Vielen Dank

Super! De Beitrag war einfach und gut. Danke

Kommentar hinzufügen

Der Inhalt dieses Feldes wird nicht öffentlich zugänglich angezeigt.

Weitere Informationen über Formatierungsoptionen