$_SESSION["some_value"] = 4;
header("Location: another-file.php");
$_SESSION["some_value"] = 5;
какое значение $_SESSION["some_value"]
?
$_SESSION["some_value"] = 4;
header("Location: another-file.php");
$_SESSION["some_value"] = 5;
какое значение $_SESSION["some_value"]
?
Значение 5.
Вы можете выводить намного больше заголовков, чем заголовки Location
с header
, большинство из которых вы не хотите останавливать выполнение кода. Если вы хотите прекратить выполнение кода, вам нужно явно вызвать exit
.
Вы должны всегда умирать() или выходить() после перенаправления (или, как указано Mark B, использовать ignore_user_abort()), потому что вы не можете точно знать, что произойдет.
Хотя некоторый код будет выполнен после перенаправления адреса заголовка, важно отметить, что не все коды после него обязательно будут выполнены.
В соответствии с вашим примером да, some_value будет равно 5. Но в какой-то момент script будет преждевременно завершен.
Возьмем следующий пример:
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!';
Если бы все остальные ответы были правильными, вы предположили бы, что $_SESSION ['some_value'] будет равно 'finished!' - но я запустил код, и это не так.
Вот мои результаты:
some_value: 174
time: 0.0026998519897461
Судебное разбирательство:
some_value: 218
time: 0.0033109188079834
Триальное испытание:
some_value: 218
time: 0.0035371780395508
Пробная версия:
some_value: 174
time: 0.0026431083679199
Судебное пять:
some_value: 174
time: 0.0027921199798584
Если я реализую ignore_user_abort (TRUE); в приведенном выше script, тогда some_value делает "законченным!" поэтому имейте это в виду, если вы намереваетесь сделать что-то критическое, например, вести журнал или запросы к базе данных или отправлять электронные письма после перенаправления.
Как только вы выдаете заголовок, вы начали гонку между вашим кодом и веб-сервером/браузером. Как правило, как только браузер получит перенаправление, он закроет соединение, в котором запущен script, и начнет подключение к новому URL-адресу переадресации. Когда соединение будет закрыто, веб-сервер обычно пытается убить script.
Вам может повезти, и вы сможете закончить что-нибудь еще, что вы хотели сделать, или вам может быть не повезло, а script даже не сможет достичь следующей строки после вызова header()
.
Существует функция ignore_user_abort()
, которая должна позволить вашему script продолжать независимо от состояния соединения.
конечно, 5. После такого заголовка вы должны добавить exit().
Команда header
не прерывает поток вашего кода. Даже если это встречается, ваша страница все еще загружается браузером, даже если она не отображается. Рассмотрим 404 страницы, которые (несмотря на ошибки) все еще обрабатываются браузером (хотя они отображаются, а перенаправления - нет).