PHP: использование exit(); или умереть(); после заголовка ( "Местоположение:" );
У меня есть система входа/регистрации пользователя, которая просто использует
// execute queries, set cookies, etc. here
header("Location: " . getenv("HTTP_REFERER"));
Недавно я прочитал сообщение о exit();
и die();
и понятия не имел, что я должен использовать их. Насколько я понимаю, они заканчивают PHP? Это верно? Каким образом я могу работать с этим, просто добавив одну из этих функций сразу после header(); у меня есть?
У меня есть AJAX, чтение jQuery через мой login.php/register.php, это повлияет каким-либо образом?
Изменить: кроме заголовка();, где еще я должен использовать функции exit();
или die();
? И exit();
больше используется вокруг PHP, тогда как die();
больше используется вокруг Perl?
Ответы
Ответ 1
Я тоже искал ответ на этот вопрос. Что я нашел:
Почему die() или exit():
Если вы не положите die() или exit() после своего header('Location: http://something')
, ваш script может продолжать приводить к неожиданному поведению. Это может привести, например, к раскрытию содержимого, которое вы действительно хотели предотвратить с помощью перенаправления (HTTP 301). Вышеупомянутый не может быть непосредственно видимым для конечного пользователя, поскольку браузер не может его отобразить (из-за 301). Вывод, функции exit() и die() останавливают script от продолжения.
Разница:
Я также хотел узнать разницу между функциями, поскольку кажется нет. Однако в PHP существует отличная разница в выходе заголовка.
В приведенных ниже примерах я решил использовать другой заголовок, но для того, чтобы показать разницу между exit() и die(), это не имеет значения.
Выход() в действии
<?php
header('HTTP/1.1 304 Not Modified');
exit();
?>
Результаты в:
HTTP/1.1 304 Not Modified
Connection: Keep-Alive
Keep-Alive: timeout=5, max=100
Die() в действии
<?php
header('HTTP/1.1 304 Not Modified');
die();
?>
Результаты в:
HTTP/1.1 304 Not Modified
Connection: close
Разница
Итак, die() закрывает соединение, а exit() - нет. Это зависит от производительности, независимо от того, хотите ли вы открыть соединение или закрыть его. Оба имеют преимущества и недостатки и зависят от ваших конкретных требований.
HTTP-постоянные соединения в Wiki
Ответ 2
http://php.net/manual/en/function.exit.php
http://php.net/manual/en/function.die.php
Эти функции используются для прерывания выполнения script. Вам нужно использовать exit
или die
, чтобы остановить выполнение вашего script после header("Location: " . getenv("HTTP_REFERER"));
, потому что в другом случае ваш script будет выполнен до конца, что может привести к неожиданному поведению.
Ответ 3
Ответ уже принят, но кажется, что у всех отсутствует вопиющий WTF в вопросе:
header("Location: " . getenv("HTTP_REFERER"));
-
Возврат референта необязателен со стороны пользовательского агента
-
его легко подделать
-
нет способа сообщить пользователю, что логин завершился неудачно
-
нет семантической связи HTTP с ошибкой аутентификации
-
в то время как переменная среды HTTP_REFERER должна быть такой же, как переменная заголовка запроса, она не указана в RFC 3875, поэтому даже там, где она представлена веб-серверу в запросе, getenv ( "HTTP_REFERER" ) может возвращать другую значение
Ответ 4
Когда header()
вызывается в конце script, нет необходимости вызывать exit()
, а не die()
, поскольку:
Ссылка на сервер будет закрыта, как только завершится выполнение script, если только он не закрыт раньше, явно вызвав mysql_close(). - php.net/function.mysql-connect
Ответ 5
Хорошо, прошло много времени с момента последнего ответа. Во всяком случае: D как-то я наткнулся на подобную проблему и посмотрел, что мое решение было:
die( Header( "Location: mytarget.php?arg1=foobar" ) );
Две птицы с одним камнем, похоже, работают на меня.
Ответ 6
for($i = 0; $i < 10; $i++)
{
if ($i == 2)
{
exit("\n Using exit(), We are done");
}
}
Теперь давайте посмотрим на тот же пример, используя die();
for($i = 0; $i < 10; $i++)
{
if ($i == 2)
{
die("\n Using die(), We are done");
}
}
Выводом для каждого из них будет: "Использование exit(), мы закончили, используя die(), мы закончили" соответственно). Теперь давайте попробуем каждый из них вывести число.
for($i = 0; $i < 10; $i++)
{
if ($i == 2)
{
exit(-1);
}
}
Просмотр выходных данных для того же примера с использованием die();
for($i = 0; $i < 10; $i++)
{
if ($i == 2)
{
die(-1);
}
}
Эти примеры были отредактированы с использованием редактора текстовой панели. В обоих вышеупомянутых случаях вывод был "Инструмент завершен с кодом выхода -1".
Итак, честный ответ на вопрос "В чем разница между die() и exit() в php" - это не видимая разница между этими двумя функциями. Они оба одинаковы, один псевдоним другого. Если кто-либо из вас сможет найти реальную заметную разницу, я был бы признателен, если бы вы опубликовали это в разделе комментариев этого блога.
До следующего раза, счастливого программирования на PHP!