
PHP Session wird (anscheinend) nicht dauerhaft über Aufruf hinweg gespeichert
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:
- $_SESSION['key'] = 'value';
- // ... weiterer Code ...
- $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:
- // ... Code
- function validate($key){
- if($_SESSION['key'] == $key){
- return true;
- }
- }
- // ... 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.
- Anmelden um Kommentare zu schreiben
Euch gefällt mein Blog?
Vielleicht hilft mir auch ein Buch, euch zukünftig (noch) bessere Artikel zu bieten? (Amazon Wunschliste)
Gerne bewerte ich auch ab und zu einmal unabhängig ein Produkt.
Ich freue mich über jede Art der Unterstützung in Form von Kommentaren, Lob oder Kritik.
Auf zum Kontaktformular!
Zu meinem Google+ Profil
Julian Pustkuchen, M. Sc. Wirtschaftsinformatik ist passionierter Software- & Webentwickler mit den Schwerpunkten Softwaredesign, Objektorientierung sowie Usability- & Ablaufoptimierung bei webks. Ein weiterer Schwerpunkt ist die Entwicklung im CMS Drupal.
Entwickelt Julian gerade keine Software, fährt er Ski, Mountainbike, spielt Badminton, segelt oder verbringt Zeit mit Freunden.
Dieser Blog dient als sein "öffentlicher Notizblo(ck/g)".
Webbasierte Lösungen? Machen wir!
webks: websolutions kept simple
http://www.webks.de
Dir hat dieser Beitrag viel Zeit und Nerven gespart?
Dann freue ich mich über jede kleine Anerkennung:
Oder du suchst weitere professionelle Unterstützung?
Dann bietet dir unser webks.de Softwareentwickler-Team professionelle Dienstleistungen im Web-Development und der Drupal CMS Entwicklung!
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
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.
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.
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