2009-09-20 7 views

Antwort

13

Im „Normalfall “ Ich glaube nicht, ob_start vor session_start genannt werden muss - noch die andere Art und Weise nahe.

Zitiert die manual page of session_start, aber:

session_start() wird intern Ausgabe handler Neuschreiben für URL registrieren, 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 ordnungsgemäße Ausgabe. Für Beispiel muss Benutzer ob_gzhandler vor Sitzungsbeginn registrieren.

Aber das ist eine Art Sonderfall: die Sache ist, hier, dass die Reihenfolge der Ausgabe-Handler wichtig ist: Wenn Sie einen Handler wollen die Dinge zu ändern, die anderen taten, müssen sie in die ausgeführt werden "richtige Reihenfolge.


Allgemeinen, wenn Sie nicht diese Art von Handler verwenden Sie (Apache und mod_deflate einen guten Job tun, wenn es darum geht, Ausgabe zu komprimieren, zum Beispiel), das einzige, was zählt, ist, dass Header nicht sein müssen gesendet, bevor Sie anrufen session_start(weil, je nach Ihrer Konfiguration, sendet session_start Cookies, die als HTTP-Header übergeben werden).

Und Header werden so schnell wie jedes Stück Daten müssen gesendet - das heißt, sobald es eine Ausgabe, auch ein Leerzeichen außerhalb von <?php ?> tags:

Hinweis: Wenn Sie Bei Verwendung von cookie-basierten -Sitzungen müssen Sie session_start() aufrufen, bevor irgendetwas an den Browser ausgegeben wird.

ob_start zeigt an, dass Daten puffern PHP hat:

Diese Funktionsausgabe Pufferung einschaltet. 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 gesendet wird, Ausgang nicht, bevor Sie tatsächlich sagen, sich selbst, „ die Daten senden“. Dies bedeutet, dass die 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 nicht verwendet wurde.


Hoffe, das macht die Dinge ein bisschen klarer ...

5

Wenn standardmäßig Ihre output_buffering ist Off und Sie unglücklich genug gewesen, um dem Kunden ein einziges Byte an Daten zurück zu senden dann HTTP Header bereits gesendet wurden. Dadurch wird verhindert, dass session_start() den Cookie-Header an den Client zurückgibt. Durch Aufruf von ob_start() aktivieren Sie die Pufferung und verzögern daher das Senden von http-Headern.

0

session_start möchten möglicherweise den HTTP-Header ändern, wenn bestimmte Konfigurationsoptionen festgelegt sind. Eine ist zum Beispiel session.use_cookies, die erfordert, dass das Set-Cookie Header-Feld gesetzt/geändert wird.

Das Ändern des HTTP-Headers erfordert, dass keine Ausgabe bereits an den Client gesendet wird, da die HTTP header direkt vor dem Senden der ersten Ausgabe gesendet wird.

So stellen Sie entweder sicher, dass es vor dem Aufruf von session_start absolut keine Ausgabe gibt. Oder Sie verwenden die output buffering control, um die Ausgabe zu puffern, so dass der HTTP-Header geändert werden kann, auch wenn bereits ausgegeben wird.

0

session_start() registriert interne Ausgabe-Handler für 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 ordnungsgemäße Ausgabe.

Zum Beispiel muss der Benutzer vor dem Start der Sitzung ob_gzhandler registrieren.

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

Im Allgemeinen, wenn Sie nicht diese Art von Handlern verwenden (Apache und mod_deflate machen einen großen Job, wenn es um die Komprimierung der Ausgabe zum Beispiel kommt), ist die einzige Sache, die zählt, dass Header nicht gesendet werden, bevor Sie anrufen session_start (weil, abhängig von Ihrer Konfiguration, session_start Cookies sendet, die als HTTP-Header übergeben werden).

Und Header werden so schnell wie jedes Stück Daten müssen gesendet - das heißt, sobald es eine Ausgabe, auch ein Leerzeichen außerhalb von <?php ?> tags:

Hinweis: Wenn Sie Bei Verwendung von Cookie-basierten Sitzungen müssen Sie session_start() aufrufen, bevor etwas an den Browser ausgegeben wird.

ob_start zeigt an, dass Daten puffern PHP hat:

zu dieser Funktion schaltet Ausgabepufferung. 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 sagen, "senden Sie die Daten". Dies 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.

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, ob_start() später zu session_start() zu verwenden.