2010-09-12 4 views

Antwort

22

?. der Wert ist 5.

Sie können viel mehr als nur Überschriften ausgegeben Location Header mit header, von denen die meisten Sie wollen nicht Ihre Codeausführung zu stoppen. Wenn Sie die Ausführung von Code stoppen wollen, müssen Sie exit anrufen explizit.

+0

sterben() hat den gleichen Effekt. –

2

natürlich 5. Sie haben exit() nach einer solchen Header hinzufügen

2

Der Befehl header unterbricht nicht den Fluss Ihres Codes. Selbst wenn das passiert, wird Ihre Seite immer noch vom Browser heruntergeladen, auch wenn sie nicht angezeigt wird. Betrachten Sie 404 Seiten, die (trotz Fehler) immer noch vom Browser verarbeitet werden (obwohl sie gerendert werden, während Weiterleitungen nicht sind).

3

Sobald Sie die Kopfzeile ausgegeben haben, haben Sie ein Rennen zwischen Ihrem Code und dem Webserver/Browser gestartet. Sobald der Browser die Weiterleitung erhält, schließt er im Allgemeinen die Verbindung, in der das Skript ausgeführt wurde, und stellt die Verbindung zur neuen Weiterleitungs-URL her. Wenn die Verbindung geschlossen ist, versucht der Webserver im Allgemeinen, das Skript zu beenden.

Sie könnten Glück haben und können alles andere beenden, was Sie tun wollten, oder Sie haben vielleicht Pech und das Skript wird nicht einmal in der Lage sein, die nächste Zeile nach dem header() Anruf zu erreichen.

Es gibt die ignore_user_abort() Funktion, die Ihr Skript trotz des Status der Verbindung fortsetzen sollte.

+1

Nein, es lädt immer noch die gesamte Antwort herunter, auch wenn es einen Standort-Header hat. Deshalb müssen Sie nach dem Header 'exit;' aufrufen, wenn Sie es umleiten möchten, ohne weiteren Code auszuführen. Wenn es zufällig war, ob es den restlichen Code ausführte oder nicht, dann wäre das kein sehr nützliches Feature, oder? –

+0

wäre das kein Feature. Es wäre nur ein lustiger kleiner Bug, der dich daran erinnert, dass Browser so funktionieren. natürlich nicht. – muhmuhten

+0

@TorValamo Ich bin mir nicht sicher, ob das genau stimmt. Ich habe an einem Projekt gearbeitet, bei dem ich den Standortheader gesetzt habe, ohne danach zu beenden, und lokal wurde der Code danach nicht ausgeführt, während, als er an einen Entwicklungsserver zum Testen geschickt wurde, der Code ausgeführt wurde! – billyonecan

4

Sie sollten immer sterben() oder beenden() nach der Umleitung (oder wie von Mark B hingewiesen, verwenden Sie ignore_user_abort()), weil Sie nicht sicher wissen können, was passieren wird.

Obwohl einige Code nach einer Header-Standortumleitung ausgeführt werden, ist es wichtig zu beachten, dass nicht der gesamte Code danach ausgeführt wird.

In Ihrem Beispiel ja, some_value ist gleich 5. Aber irgendwann wird das Skript vorzeitig beendet.

Nehmen Sie das folgende Beispiel:

session_start(); 
$_SESSION["some_value"] = 'original value'; 
header("Location: /index.php/test2"); 

$start_time = microtime(true); 

for($i = 0; $i <= 100000; $i ++) 
{ 
    password_hash($i); // slow it down 
    $_SESSION["some_value"] = $i; 
    $_SESSION['time'] = microtime(true) - $start_time; 
} 

$_SESSION['some_value'] = 'finished!'; 

Wenn alle anderen Antworten richtig waren, Sie $ _SESSION annehmen würde [ 'some_value'] würde 'fertig!' Gleich - Aber ich habe den Code ausgeführt und das ist nicht der Fall.

Hier sind meine Ergebnisse:

some_value: 174 
time: 0.0026998519897461 

Test zwei:

some_value: 218 
time: 0.0033109188079834 

Test drei:

some_value: 218 
time: 0.0035371780395508 

Test vier:

some_value: 174 
time: 0.0026431083679199 
fünf

Versuch:

some_value: 174 
time: 0.0027921199798584 

Wenn ich implementieren ignore_user_abort (TRUE); im obigen Skript ist dann some_value gleich "fertig!" Denken Sie also daran, wenn Sie etwas Wichtiges wie Logging oder Datenbankabfragen oder das Versenden von E-Mails nach der Weiterleitung beabsichtigen.

Verwandte Themen