Подтвердить что ты не робот

Является ли код после заголовка ("Расположение:...) выполнен?

$_SESSION["some_value"] = 4;
header("Location: another-file.php");
$_SESSION["some_value"] = 5;

какое значение $_SESSION["some_value"]?

4b9b3361

Ответ 1

Значение 5.

Вы можете выводить намного больше заголовков, чем заголовки Location с header, большинство из которых вы не хотите останавливать выполнение кода. Если вы хотите прекратить выполнение кода, вам нужно явно вызвать exit.

Ответ 2

Вы должны всегда умирать() или выходить() после перенаправления (или, как указано 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 делает "законченным!" поэтому имейте это в виду, если вы намереваетесь сделать что-то критическое, например, вести журнал или запросы к базе данных или отправлять электронные письма после перенаправления.

Ответ 3

Как только вы выдаете заголовок, вы начали гонку между вашим кодом и веб-сервером/браузером. Как правило, как только браузер получит перенаправление, он закроет соединение, в котором запущен script, и начнет подключение к новому URL-адресу переадресации. Когда соединение будет закрыто, веб-сервер обычно пытается убить script.

Вам может повезти, и вы сможете закончить что-нибудь еще, что вы хотели сделать, или вам может быть не повезло, а script даже не сможет достичь следующей строки после вызова header().

Существует функция ignore_user_abort(), которая должна позволить вашему script продолжать независимо от состояния соединения.

Ответ 4

конечно, 5. После такого заголовка вы должны добавить exit().

Ответ 5

Команда header не прерывает поток вашего кода. Даже если это встречается, ваша страница все еще загружается браузером, даже если она не отображается. Рассмотрим 404 страницы, которые (несмотря на ошибки) все еще обрабатываются браузером (хотя они отображаются, а перенаправления - нет).