Warum muss ob_start () vor session_start () stehen, um in PHP zu arbeiten?

8

Ich denke nicht, dass es vernünftig ist.

Warum ist das eigentlich eine solche Regel?

    
omg 20.09.2009, 13:13
quelle

5 Antworten

13

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 ...

    
Pascal MARTIN 20.09.2009 13:21
quelle
5

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.

    
Michael Krelin - hacker 20.09.2009 13:29
quelle
0

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.

    
Gumbo 20.09.2009 13:52
quelle
0

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.

    
Sarang Chaudhari 29.03.2014 06:22
quelle
0

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 ().

    
Bimal Poudel 07.01.2015 11:54
quelle

Tags und Links