- Warning: Cannot send session cookie – headers already sent…
- Warning: open(/tmp\sess_…, O_RDWR) failed…
Warning: Cannot send session cookie – headers already sent…
Der häufigste Fehler ist der Versuch eine Session zu starten, nachdem HTML-Daten an den Browser geschickt worden sind. Diesen Versuch quitiert PHP 4 mit “Warning: Cannot send session cookie – headers already sent…”.
Ein Response – die Antwort – des Webservers teils sich in zwei Bereiche:
- den Header, der u.a. den Content-Type (z.B. HTML oder Bilddaten) der Daten definiert
- und die Daten selbst
Wird nun von einem PHP-Script z.B. ein Leerzeichen ausgegeben, so nimmt PHP an, dass es sich um HTML handelt und schickt automatisch entsprechende Header und das Leerzeichen (Daten) an den Browser. Versucht nun PHP danach nochmals einen Header zu senden, kommt es zu der beschreibenen Fehlermeldung, da das Senden der Header bereits abgeschlossen ist.
Man mag sich jetzt fragen, wo der Zusammenhang zwischen dem Versuch session_start() resp. session_register() auszuführen und den Headern besteht. Nun, die Session-Funktionen benutzen Cookies zur Speicherung der Session-ID, und ein Cookie wird als Teil des Response-Headers an den Browser übermittelt. In der PHP-Voreinstellung führt jedes Starten der Session zum Versuch einen Cookie mittels einem Header an den Client zu schicken.
Die typischen Stolperfallen:
- Leerzeichen bzw. -zeilen vor dem ersten <? bzw. <?php Delimiter des Scripts
- oder mit include() oder require() importierte Scriptfragmente, die natürlich gar keine Ausgabe produzieren dürfen – weder vor dem ersten Delimiter, noch dazwischen, noch nach dem letzten.
Zusätzlich kommt durch die auto_prepend_file-Einstellung in der php.ini, bzw. in der Webserverkonfiguration, eine weitere potentielle Fehlerquelle hinzu.
Falsch (HTML-Kommentar, Zeile 1 und 2):
1: <!-- HTML: meine dynamische Webseite mit Sessions --> 2:Â Â 3: <?php 4:Â Â Â @session_start();Â Â 5: ?>
Falsch (Leerzeile in Zeile 4):
1: <?php 2:Â Â Â include 'seitenkopf.php'; 3: ?> 4:Â Â 5: <?php 6:Â Â Â @session_start();Â Â 7: ?>
Richtig:
1: <?php 2:Â Â Â /* 'seitenkopf.php' produziert keine Ausgabe! */ 3:Â Â Â Â Â Â 4:Â Â Â include 'seitenkopf.php'; 5:Â Â 6:Â Â Â @session_start();Â Â 7: ?>
Merke:
- Eine Session muss vor der Ausgabe jeglicher Zeichen gestartet werden, also am besten als einer der allerersten Befehle eines Scriptes.
Warning: open(/tmp\sess_…, O_RDWR) failed…
Windowsbasierte Betriebssysteme benutzen einen Backslash (”\”) als Verzeichnistrenner. In der php.ini ist dagegen der Standardpfad für die Sessiondateien als /tmp eingetragen – also mit einem normalem Slash (”/”), wie er auf unixoiden Betriebssystemen benutzt wird. Abhilfe schafft hier z.B. das Anlegen eines Verzeichnisses c:\temp und die entsprechende Änderung in der globalen Konfigurationsdatei php.ini:
session.save_path  = c:\temp       ; für Windows