Выполнен ли код после заголовка ("Location: ...)? - PullRequest
23 голосов
/ 12 сентября 2010
$_SESSION["some_value"] = 4;
header("Location: another-file.php");
$_SESSION["some_value"] = 5;

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

Ответы [ 5 ]

27 голосов
/ 12 сентября 2010

Значение равно 5.

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

8 голосов
/ 28 февраля 2017

Вы всегда должны умереть () или выйти () после перенаправления (или, как отметил Марк Б, используйте ignore_user_abort ()), потому что иначе вы не можете точно знать, что произойдет.

Хотянекоторый код будет выполнен после перенаправления расположения заголовка, важно отметить, что не весь код после него обязательно будет выполнен.

В соответствии с вашим примером, yes_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'] будет равно 'закончено!'- но я запустил код, и это не тот случай.

Вот мои результаты:

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

3 голосов
/ 12 сентября 2010

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

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

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

2 голосов
/ 12 сентября 2010

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

1 голос
/ 12 сентября 2010

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

...