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

$_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. Но в какой-то момент сценарий будет преждевременно прекращен.

Возьмем следующий пример:

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

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

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

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

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

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