Warum muss ob_start() vor session_start() kommen, um in PHP zu funktionieren?

Lesezeit: 4 Minuten

Ich denke nicht, dass es vernünftig ist.

Warum ist es eigentlich so eine Regel?

  • Ehrlich gesagt: Ich habe noch nie von einer solchen Regel gehört!

    – Mauris

    20. September 2009 um 13:20 Uhr

In dem “Normalfall“, denke ich nicht ob_start muss vorher angerufen werden session_start — noch umgekehrt.

Zitieren der Handbuchseite von session_startobwohl :

session_start() registriert den internen Ausgabehandler für das URL-Umschreiben, wenn trans-sid aktiviert ist. Wenn ein Benutzer ob_gzhandler oder ähnliches mit ob_start() verwendet, ist die Reihenfolge des Ausgabehandlers wichtig für die korrekte Ausgabe. Beispielsweise muss der Benutzer ob_gzhandler vor dem Sitzungsstart registrieren.

Aber dies ist eine Art Sonderfall: Hier ist die Reihenfolge der Ausgabe-Handler wichtig: Wenn Sie möchten, dass ein Handler Dinge ändert, die der andere getan hat, müssen sie in der “richtigen” Reihenfolge ausgeführt werden.

Im Allgemeinen, wenn Sie diese Art von Handlern nicht verwenden (Apache u mod_deflate gute Arbeit leisten, wenn es zum Beispiel um die Komprimierung der Ausgabe geht)wichtig ist nur, dass keine Header gesendet werden dürfen, bevor Sie anrufen session_start (denn je nach Konfiguration session_start sendet Cookies, die als HTTP-Header übergeben werden).

Und Header werden gesendet, sobald Daten gesendet werden müssen – dh sobald es eine Ausgabe gibt, auch nur ein Leerzeichen außerhalb <?php ?> Stichworte :

Hinweis: Wenn Sie cookiebasierte Sitzungen verwenden, müssen Sie session_start() aufrufen, bevor etwas an den Browser ausgegeben wird.

ob_start gibt an, dass PHP Daten puffern muss:

Diese Funktion schaltet die Ausgangspufferung ein. Während die Ausgabepufferung aktiv ist, wird keine Ausgabe vom Skript gesendet (außer Headern), stattdessen wird die Ausgabe in einem internen Puffer gespeichert.

Auf diese Weise wird die Ausgabe nicht gesendet, bevor Sie selbst sagen: “die Daten senden“. Dies bedeutet, dass Header nicht sofort gesendet werden – was bedeutet session_start kann später aufgerufen werden, auch wenn es hätte ausgegeben werden sollen, wenn ob_start war nicht benutzt worden.

Hoffe das macht die Sache etwas klarer…

Warum muss ob start vor session start kommen um in PHP zu
Michael Krelin – Hacker

Wenn standardmäßig Ihre output_buffering ist Off und Sie hatten das Pech, ein einziges Datenbyte an den Client zurückzusenden, als Sie es waren HTTP Kopfzeilen wurden bereits gesendet. Was effektiv verhindert session_start() daran hindern, den Cookie-Header an den Client zurückzusenden. Durch Anruf ob_start() Sie aktivieren die Pufferung und verzögern daher das Senden von HTTP-Headern.

session_start Möglicherweise möchten Sie den HTTP-Header ändern, wenn bestimmte Konfigurationsoptionen festgelegt sind. Einer ist zum Beispiel session.use_cookies das erfordert, die einzustellen/zu ändern Set-Cookie Header-Feld.

Das Ändern des HTTP-Headers erfordert, dass keine Ausgabe bereits an den Client als gesendet wurde HTTP-Header wird unmittelbar vor dem Senden der ersten Ausgabe gesendet.

So stellen Sie entweder sicher, dass vor dem Aufruf von absolut keine Ausgabe erfolgt session_start. Oder Sie verwenden die Steuerung der Ausgangspufferung um die Ausgabe zu puffern, sodass der HTTP-Header geändert werden kann, auch wenn bereits eine Ausgabe vorhanden ist.

Warum muss ob start vor session start kommen um in PHP zu
Sarang Chaudhari

session_start() registriert den internen Ausgabehandler für das URL-Umschreiben, wenn trans-sid aktiviert. Wenn ein Benutzer verwendet ob_gzhandler oder wie mit ob_start()ist die Reihenfolge des Ausgabehandlers wichtig für die ordnungsgemäße Ausgabe.

Beispielsweise muss sich der Benutzer registrieren ob_gzhandler vor Sitzungsbeginn.

Aber das ist eine Art Sonderfall. Die Sache ist hier, dass die Reihenfolge der Output-Handler wichtig ist. Wenn Sie möchten, dass ein Handler Dinge ändert, die der andere geändert hat, müssen sie in der “richtigen” Reihenfolge ausgeführt werden.

Wenn Sie diese Art von Handlern nicht verwenden (Apache und mod_deflate sehr gute Arbeit leisten, wenn es zum Beispiel darum geht, die Ausgabe zu komprimieren), wichtig ist nur, dass Header nicht gesendet werden dürfen, bevor Sie anrufen session_start (denn je nach Konfiguration session_start sendet Cookies, die als HTTP-Header übergeben werden).

Und Header werden gesendet, sobald Daten gesendet werden müssen – dh sobald es eine Ausgabe gibt, auch nur ein Leerzeichen außerhalb <?php ?> Stichworte :

Notiz: Wenn Sie Cookie-basierte Sitzungen verwenden, müssen Sie anrufen session_start() bevor etwas an den Browser ausgegeben wird.

ob_start gibt an, dass PHP Daten puffern muss:

Diese Funktion schaltet die Ausgangspufferung ein. Während die Ausgabepufferung aktiv ist, wird keine Ausgabe vom Skript gesendet (außer Headern), stattdessen wird die Ausgabe in einem internen Puffer gespeichert.

Auf diese Weise wird die Ausgabe nicht gesendet, bevor Sie selbst sagen: “Senden Sie die Daten”. Das bedeutet, dass Header nicht sofort gesendet werden – was bedeutet, dass session_start später aufgerufen werden kann, auch wenn es hätte ausgegeben werden sollen, wenn ob_start war nicht benutzt worden.

session_start(); 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, falls Sie etwas Unbekanntes debuggen; alles unten funktioniert wie erwartet (nicht nur wie geschrieben ;-)). Ich bevorzuge ob_start() später als session_start().

995400cookie-checkWarum muss ob_start() vor session_start() kommen, um in PHP zu funktionieren?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy