Im " normalen Fall " glaube ich nicht, dass ob_start
vor session_start
aufgerufen werden muss - und auch nicht anders herum.
Aber die Manual-Seite von session_start
wird zitiert:
session_start () wird intern registriert Ausgabe-Handler für das URL-Rewriting wenn trans-sid ist aktiviert. Wenn ein Benutzer verwendet ob_gzhandler oder like mit ob_start (), Die Reihenfolge der Ausgabe-Handler ist wichtig für die richtige Ausgabe. Zum Beispiel, Benutzer muss sich registrieren ob_gzhandler vor dem Start der Sitzung.
Aber das ist ein spezieller Fall: Hier ist die Reihenfolge der Ausgabe-Handler wichtig: Wenn Sie möchten, dass ein Handler die Dinge ändert, die der andere getan hat, müssen sie im "richtigen" Modus ausgeführt werden. bestellen.
Im Allgemeinen, wenn Sie diese Art von Handlern nicht verwenden (Apache und mod_deflate
macht einen großen Job, wenn es um die Komprimierung der Ausgabe geht, zum Beispiel , das einzige, was zählt, ist, dass Header nicht gesendet werden müssen, bevor Sie session_start
aufrufen (weil, abhängig von Ihrer Konfiguration) , session_start
sendet Cookies, die als HTTP-Header übergeben werden .
Und Kopfzeilen werden gesendet, sobald ein Datenelement gesendet werden muss - dh sobald eine Ausgabe erfolgt, auch ein Leerzeichen außerhalb von <?php ?>
tags:
Hinweis: Wenn Sie Cookies verwenden Sitzungen müssen Sie anrufen session_start () bevor irgendetwas ist an den Browser ausgegeben.
ob_start
zeigt an, dass PHP Daten puffern muss:
Diese Funktion schaltet den Ausgang ein puffern an. Während der Pufferung der Ausgabe ist aktiv es wird keine Ausgabe von der gesendet Skript (außer Header) statt Die Ausgabe wird in einem internen gespeichert Puffer.
Auf diese Weise wird die Ausgabe nicht gesendet, bevor Sie selbst sagen, " send die Daten ". Das bedeutet, dass Header nicht sofort gesendet werden - was bedeutet, dass session_start
später aufgerufen werden kann, auch wenn es ausgegeben worden wäre, wenn ob_start
nicht verwendet worden wäre.
Ich hoffe, das macht die Dinge ein bisschen klarer ...
Wenn Ihr output_buffering
standardmäßig Off
ist und Sie unglücklicherweise ein einziges Datenbyte zurück an den Client gesendet haben, wurden Ihre HTTP
Header bereits gesendet. Dies verhindert effektiv, dass session_start()
den Cookie-Header an den Client zurückgibt. Wenn Sie ob_start()
aufrufen, aktivieren Sie die Pufferung und verzögern das Senden von http-Headern.
session_start
möchte möglicherweise den HTTP-Header ändern, wenn bestimmte Konfigurationsoptionen festgelegt sind. Eine ist zum Beispiel session.use_cookies Dazu muss das Header-Feld Set-Cookie gesetzt / geändert werden.
Das Ändern des HTTP-Headers erfordert, dass es keine Ausgabe gibt, die bereits an den Client als HTTP-Header wird gesendet, unmittelbar bevor die erste Ausgabe gesendet wird.
Sie stellen also entweder sicher, dass vor dem Aufruf von session_start
überhaupt keine Ausgabe erfolgt. Oder Sie verwenden das Ausgabepuffersteuerelement , um die Ausgabe zu puffern, so dass der HTTP-Header sogar geändert werden kann wenn es bereits ausgegeben wird.
session_start()
registriert den internen Ausgabehandler für das URL-Umschreiben, wenn trans-sid
aktiviert ist. Wenn ein Benutzer ob_gzhandler
oder like mit ob_start()
verwendet, ist die Reihenfolge der Ausgabe-Handler wichtig für eine korrekte Ausgabe.
Zum Beispiel muss der Benutzer ob_gzhandler
vor dem Start der Sitzung registrieren.
Aber das ist eine Art Sonderfall. Die Sache ist hier, dass die Reihenfolge der Ausgabe-Handler wichtig ist. Wenn ein Handler die Dinge ändern soll, die der andere getan hat, müssen sie in der "richtigen" Reihenfolge ausgeführt werden.
Wenn Sie diese Art von Handlern nicht verwenden (Apache und mod_deflate
machen zum Beispiel beim Komprimieren der Ausgabe großartige Arbeit), ist es nur wichtig, dass die Header nicht vor Ihnen gesendet werden Rufen Sie session_start
auf (weil abhängig von Ihrer Konfiguration session_start
Cookies sendet, die als HTTP-Header übergeben werden).
Und Kopfzeilen werden gesendet, sobald ein Datenelement gesendet werden muss - dh sobald eine Ausgabe erfolgt, auch ein Leerzeichen außerhalb von <?php ?>
tags:
Hinweis: Wenn Sie cookie-basierte Sitzungen verwenden, müssen Sie session_start()
aufrufen, bevor etwas an den Browser ausgegeben wird.
ob_start
zeigt an, dass PHP Daten puffern muss:
Diese Funktion aktiviert die Ausgangspufferung. Während die Ausgabepufferung aktiv ist, wird keine Ausgabe vom Skript (außer den Headern) gesendet, stattdessen wird die Ausgabe in einem internen Puffer gespeichert.
Auf diese Weise wird die Ausgabe nicht gesendet, bevor Sie tatsächlich selbst "Daten senden" sagen. Das bedeutet, dass Header nicht sofort gesendet werden - was bedeutet, dass session_start später aufgerufen werden kann, selbst wenn es ausgegeben worden wäre, wenn ob_start
nicht verwendet wurde.
session_start (); sollte aufgerufen werden, bevor Header gesendet werden. ob_start () unterdrückt die Ausgabe für eine Weile und Sie können diese Regel brechen. Normalerweise ist ob_start () oben eine schnelle Lösung für den Fall, dass Sie etwas Unbekanntes debuggen; alles unten funktioniert wie erwartet (nicht nur wie geschrieben ;-)). Ich bevorzuge es später ob_start () zu session_start ().