мне нужно использовать выход после заголовка ("Местоположение: http://localhost/...");? - PullRequest
16 голосов
/ 03 апреля 2011

Я создаю сценарий для проверки формы и задаю себе вопрос. Когда я использую заголовок (см. Пример ниже), мне нужно использовать выход сразу после? Я имею в виду, означает ли использование заголовка, что он по умолчанию завершается, поэтому мне не нужно использовать команду exit?

// cancel button clicked
if (isset($_POST['cancel'])) {
  header("Location: http://localhost/admin/tracks.php");
  exit;
}

echo '<p>$name</p>'

Ответы [ 6 ]

23 голосов
/ 03 апреля 2011

Вы должны вызвать exit(), потому что header() не будет автоматически останавливать выполнение скрипта - или, если это произойдет (честно говоря, я не на 100%), это определенно не остановит скрипт немедленно.

Например, попробуйте этот код:

<?php

  header("Location: http://www.google.com");
  unlink(__FILE__);

?>

Этот маленький скрипт использует header() для перенаправления вас в Google, а затем удаляет себя.Если вы запустите его, вы заметите, что после перенаправления файл все равно был удален.Это означает, что вызов unlink() все еще выполнялся, хотя вызов header() перенаправил вас.

7 голосов
/ 03 апреля 2011

Я использую exit после вызова header-> location, потому что я хочу АБСОЛЮТНО полагаться на тот факт, что сценарий не пройдет мимо вызова header-> location.

Если где-то есть ошибка, и ваш скрипт начинает генерировать выходные данные ДО вызова заголовка -> местоположение, вызов завершится неудачно, и выполнение сценария продолжится в обычном режиме (если вы не вызовете exit)

1 голос
/ 03 апреля 2011

Хотя приведенные выше ответы звучат великолепно, если вы не уверены в своем пути к коду, это может привести к неожиданным результатам.Например, если вы используете платформу, основанную на том факте, что выполнение кода будет выполняться от начала до конца, вы можете непреднамеренно прервать его.

Это может быть нормально с точки зрения пользователя, поскольку они все равно будутперенаправляется и не будет мудрым, но учтите следующее:

Вы используете платформу (ОС или пользовательскую), которая ожидает протоколировать перенаправления, или установить дополнительные заголовки (или любое количество других элементов).Позвонив по номеру exit, вы обойдете эту логику и, следовательно, можете получить неожиданные результаты.

Короче говоря, да, описанные выше методы сработают, просто предостережение, чтобы знать, чего вы ожидаетеперед коротким замыканием.

0 голосов
/ 17 мая 2018

Это НЕ останавливает выполнение вашего скрипта, ваш скрипт продолжает работать, и иногда все, что нужно человеку (может быть с плохими намерениями), - это ваш скрипт, чтобы достичь определенной точки, где он мог бы выполнить X. Header () просто перенаправление, выход (); однако остановит скрипт прямо на месте (где exit (); есть). или как кто-то еще указал под именем пользователя:

Коди. A. Ray: Да, сценарий продолжает обрабатываться после вызова заголовка ('Location: http://google.com'), если вы явно не прервите его! Я только что попробовал это локально. Я добавил test.php на сайт в apache с этим содержимым

<?php

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

?>

И проверил мой / var / log / apache2 / error_log на эту запись:

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

итак, вывод: заголовок не останавливает выполнение скрипта.

0 голосов
/ 03 апреля 2011

использование заголовка также означает, что он по умолчанию завершается

Как так? Что если ваш заголовок не Location: один, а Content-type: или Cache-control или что-то еще?

0 голосов
/ 03 апреля 2011

Вывод, как правило, не отправляется (в зависимости от буферизации вывода и т. Д.), Если вы так перенаправляете, но, как показано в примере unlink (), скрипт не умирает с header ().

Так что вызовы exit () или die () необходимы, если вы хотите предотвратить продолжение сценария после перенаправления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...