Frage Wird das PHP-Skript nach der Header-Weiterleitung ausgeführt?


Ja, diese Frage wurde schon früher gestellt, aber die Antworten waren inkonsistent. Nehmen Warum muss ich nach der Umleitung über den Header ('Location ..') in PHP 'exit' aufrufen? zum Beispiel. Jede Antwort (einschließlich der angenommenen Antwort) gibt "ja" an, mit Ausnahme der letzten Antwort, die null Stimmen erhält, die "vielleicht" lautet. Ich fange an zu denken, dass die richtige Antwort "vielleicht" ist. Um es zu einer einfachen "Ja" - oder "Nein" -Frage zu machen, wird doThis () mit dem folgenden Skript ausgeführt? Vielen Dank

header('Location: http://somewhereElse.com');
//die();
sleep(1000);
doThis();

BEARBEITEN Danke, alles. Bei meiner PHP / Linux / Apache-Konfiguration wird das zweite syslog () ausgeführt, also lautet die Antwort "Ja, alle Skripte im Downstream des Headers werden ausgeführt." Ich werde davon ausgehen (und hoffe ich bin richtig) es ist das gleiche mit allen PHP / Linux / Apache Konfigurationen!

<?php
  header('Location: http://google.com');
  syslog(LOG_INFO,'first');  
  sleep(5);
  syslog(LOG_INFO,'Second');  
?>

22
2018-02-13 05:31


Ursprung


Antworten:


Ja, das Skript wird nach dem Aufruf von weiter verarbeitet header('Location: http://google.com') wenn Sie es nicht explizit beenden! Ich habe das gerade vor Ort ausprobiert. Ich habe test.php zu einer Site in Apache mit diesen Inhalten hinzugefügt:

<?php

header('Location: http://google.com');
error_log("WE MADE IT HERE SOMEHOW");

?>

Und habe meine / var / log / apache2 / error_log für diesen Eintrag überprüft:

[Tue Feb 12 23:39:23 2013] [error] [client 127.0.0.1] WE MADE IT HERE SOMEHOW

Möglicherweise überraschend, aber ja, es wird weiter ausgeführt, wenn Sie die Ausführung nicht stoppen.


19
2018-02-13 05:41



Die Leute scheinen das wirklich durcheinander zu bringen und warum das Skript ausgeführt wird. Wenn Sie den Redirect-Header senden, leitet der Browser den Benutzer sofort auf die neue Seite weiter, aber Ihr Server wird den Code weiter verarbeiten, obwohl am Ende niemand den Code empfängt. Dies bedeutet nicht, dass das Skript beendet wird. Es sei denn, Sie konfigurieren Apache, um das Skript zu stoppen, wenn es erkennt, dass niemand am anderen Ende ist.

Wenn ein PHP-Skript normal ausgeführt wird, ist der NORMAL-Status aktiv. Wenn der Remote-Client die Verbindung unterbricht, wird das Status Flag ABORTED aktiviert. Eine Remote-Client-Trennung wird normalerweise dadurch verursacht, dass der Benutzer seine STOP-Taste drückt.

Sie können entscheiden, ob eine Client-Trennung verursacht werden soll oder nicht   Ihr Skript wird abgebrochen. Manchmal ist es praktisch, immer Ihre haben   Skripts werden vollständig ausgeführt, auch wenn kein Remote-Browser empfangen wird   die Ausgabe. Das Standardverhalten ist jedoch für Ihr Skript   abgebrochen, wenn der Remote-Client die Verbindung trennt. Dieses Verhalten kann festgelegt werden   über die ignore_user_abort php.ini Richtlinie sowie durch die   Entsprechender php_value ignore_user_abort Apache httpd.conf Direktive   oder mit dem ignore_user_abort() Funktion.

Die korrekte Umleitung eines Benutzers ohne weitere Aktionen ist:

header("Location: blah.php");
exit();

7
2018-05-25 03:50



Lass mich mehr erklären. Lassen Sie uns ein Beispiel mit Session verwenden.

$_SESSION["username"] = 'some username';
header("Location: another-file.php");
$_SESSION["username"] = 'replace username';

Ergebnis von $_SESSION["username"] wird sein replace username

Sie können viel mehr Header als nur ausgeben Location Header mit Header, von denen Sie die Codeausführung nicht beenden möchten. Wenn Sie die Codeausführung stoppen möchten, müssen Sie anrufen exit ausdrücklich.

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


5
2018-02-13 05:44



Ausführen des Codes:

//http://www.php.net/manual/en/function.header.php
header('Location: http://google.com');
flush();
sleep(3);

$a=fopen('test.txt', 'w');
fwrite($a,headers_sent());
fclose($a);

Der Server pausierte und schrieb die Datei, bevor der Client mich umgeleitet hat. Dies liegt daran, auch nach flush()In dem Puffer wird die Umleitung nicht verarbeitet, bis das Skript die Ausführung beendet (dh das Skript beendet wurde). Die Datei test.txt hatte '1' in jedem FallDas bedeutet, dass die Header gesendet wurden und vom Browser nicht verarbeitet wurden, bis die Verbindung beendet wurde.

  • in jedem Fall, was auf einer win32-Entwicklungsmaschine, einer Linux-Entwicklungsmaschine und einer Linux-Produktionsumgebung bedeutet.

3
2018-02-13 05:51



Dieses erste Beispiel zeigt, dass Code nach der Header-Standortumleitung ausgeführt wird, aber nicht unbedingt der gesamte Code ausgeführt wird. Sobald der Browser auf den Redirect-Header reagiert, wird die Verbindung auf der aktuellen Seite beendet, wodurch PHP die Ausführung des Codes beendet. Dies zeigt, wie man Dinge NICHT tut.

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!';

// Result:
// some_value = 174

In diesem Beispiel habe ich ignore_user_abort () hinzugefügt, um zu zeigen, wie der gesamte Code ausgeführt wird:

ignore_user_abort(TRUE);
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!';

// Result:
// some_value = finished!

Und so würden Sie normalerweise eine Weiterleitung ausführen, indem Sie das Skript unmittelbar nach der Weiterleitung löschen:

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

$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!';

// Result:
// some_value = original value

Kurz gesagt, benutze entweder Die (), Exit () oder Ignore_user_abort (TRUE);


1
2018-02-28 17:17



Ja, es wird für kurze Zeit ausgeführt.

Sobald der Redirect-Header an den Browser gesendet wurde, wird der Browser   Schließen Sie die aktuelle Verbindung und öffnen Sie eine neue für die Weiterleitungs-URL.   Bis diese ursprüngliche Verbindung geschlossen ist und Apache die   Skript wird Ihr Code weiterhin wie zuvor ausgeführt.

In der Theorie, wenn es eine ausreichend schnelle Verbindung zwischen den   Client / Server, und es gab keine Pufferung in der Pipeline,   Die Ausgabe des Headers würde dazu führen, dass das Skript beendet wird   sofort. In Wirklichkeit kann es irgendwo zwischen "jetzt" und "nie" sein   damit die Abschaltung eingeleitet wird.

Weiterlesen


0
2018-02-13 05:42



Ja Ja Ja, Header ist wie jeder andere Teil des PHP-Skripts, wird nach der Ausführung des Skripts gesendet, der Trick ist jedoch: Wenn wir auf eine neue URL umleiten wollen: Warum sollten Skripte nach dem Header weiter ausgeführt werden ("location : url "); ?>

<?php
header('Location: test.php');
header('Location: test.php');
header('Location: test.php');
header('Location: test.php');
header('Location: test.php');
header('Location: test.php');
header('Location: test.php');

$var = 'google.com';
header("Location: http://$var");

?> 

0
2018-02-13 05:49



header("Location: http://example.com/newURL.php");
die;

Ja, das Skript wird nach der Header-Weiterleitung fortgesetzt. Rufen Sie also unbedingt auf die; oder exit; jedes Mal, wenn Sie umleiten, um die Ausführung zu stoppen. Sie müssen das Skript nicht in den Ruhezustand versetzen :).

Wie man eine Umleitung in PHP macht?


0
2018-02-10 17:14