Да, этот вопрос был задан раньше, однако ответы были непоследовательными. Возьмите Почему мне нужно вызывать «exit» после перенаправления через заголовок («Местоположение ..») в PHP? например. В каждом ответе (включая принятый ответ) говорится: да, кроме последнего ответа, который получил нулевые голоса, который говорит «может быть». Я начинаю думать, что правильный ответ «возможно». Чтобы сделать это простым вопросом «да» или «нет», выполнит ли doThis () данный сценарий? благодаря
header('Location: http://somewhereElse.com'); //die(); sleep(1000); doThis();
EDIT Спасибо, все. С моей конфигурацией PHP / Linux / Apache выполняется второй syslog (), поэтому ответ «да, будет запущен весь сценарий вниз по заголовку». Я предполагаю (и надеюсь, что я прав), это то же самое со всеми конфигурациями PHP / Linux / Apache!
<?php header('Location: http://google.com'); syslog(LOG_INFO,'first'); sleep(5); syslog(LOG_INFO,'Second'); ?>
Да, сценарий продолжает обрабатываться после вызова header('Location: http://google.com')
если вы его явно не прекратили! Я просто попробовал это на месте. Я добавил test.php на сайт в apache с этим содержимым:
<?php header('Location: http://google.com'); error_log("WE MADE IT HERE SOMEHOW"); ?>
И проверил мой / var / log / apache2 / error_log для этой записи:
[Tue Feb 12 23:39:23 2013] [error] [client 127.0.0.1] WE MADE IT HERE SOMEHOW
Возможно, это удивительно, но да, он продолжает выполняться, если вы не прекращаете выполнение.
Люди, похоже, действительно запутались, и почему сценарий выполнен. Когда вы отправляете заголовок переадресации, браузер сразу перенаправляет пользователя на новую страницу, но ваш сервер будет продолжать обрабатывать код, даже если его нет в конце, это не означает, что скрипт завершен. Если вы не настроите Apache, чтобы остановить скрипт, когда он реализует, на другом конце нет никого.
Когда PHP-скрипт работает нормально, состояние NORMAL является активным. Если удаленный клиент отключает флаг состояния ABORTED, он включается. Отключение удаленного клиента обычно вызвано тем, что пользователь нажал кнопку STOP.
Вы можете решить, хотите ли вы отключить клиент, чтобы ваш сценарий был прерван. Иногда бывает удобно всегда запускать ваши скрипты, даже если удаленный браузер не получает выход. Однако поведение по умолчанию для вашего скрипта прерывается, когда удаленный клиент отключается. Это поведение может быть задано с помощью директивы
ignore_user_abort
php.ini, а также через соответствующую директивуignore_user_abort
Apache httpd.conf или с помощью функцииignore_user_abort()
.
Правильный способ перенаправления пользователя без дальнейших действий:
header("Location: blah.php"); exit();
Позвольте мне объяснить больше. давайте возьмем пример, используя сеанс.
$_SESSION["username"] = 'some username'; header("Location: another-file.php"); $_SESSION["username"] = 'replace username';
Результат $_SESSION["username"]
replace username
Вы можете выводить гораздо больше заголовков, чем только заголовки Location
с заголовком, большинство из которых вы не хотите останавливать выполнение кода. Если вы хотите прекратить выполнение кода, вам нужно явно вызвать exit
.
Команда header
не прерывает поток вашего кода. Даже если это встречается, ваша страница все еще загружается браузером, даже если она не отображается. Рассмотрим 404 pages
, которые (несмотря на ошибки) все еще обрабатываются браузером (хотя они отображаются, а перенаправления – нет).
Запуск кода:
//http://www.php.net/manual/en/function.header.php header('Location: http://google.com'); flush(); sleep(3); $a=fopen('test.txt', 'w'); fwrite($a,headers_sent()); fclose($a);
Сервер остановился и написал файл до того, как клиент перенаправил меня. Это связано с тем, что даже после flush()
в буфере перенаправление не обрабатывается до тех пор, пока скрипт не прекратит выполнение (т. Е. Завершение сценария). Файл test.txt
имел «1» в каждом случае , что означало, что заголовки были отправлены, просто не обработаны браузером до тех пор, пока соединение не будет прекращено.
Этот первый пример показывает, что некоторый код выполняется после перенаправления адреса заголовка, но не все коды обязательно выполняются. После того, как браузер начнет отвечать на заголовок перенаправления, он прекратит соединение на текущей странице, что заставит PHP прекратить выполнение своего кода. Это показывает, как НЕ делать что-то.
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!'; // Result: // some_value = 174
В этом примере я добавил ignore_user_abort (), чтобы показать, как выполнить весь код:
ignore_user_abort(TRUE); 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!'; // Result: // some_value = finished!
И так вы обычно выполняете перенаправление, убивая скрипт сразу после перенаправления:
session_start(); $_SESSION["some_value"] = 'original value'; header("Location: /index.php/test2"); die(); $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!'; // Result: // some_value = original value
Короче говоря, либо используйте die (), exit (), либо ignore_user_abort (TRUE);
Да, он будет выполнен на короткий промежуток времени.
Как только заголовок перенаправления отправляется в браузер, браузер закроет текущее соединение и откроет новый для URL-адреса переадресации. Пока это оригинальное соединение не будет закрыто, и Apache выключит скрипт, ваш код будет продолжать выполняться по-прежнему.
Теоретически, если бы существовала достаточно быстрая связь между клиентом / сервером и не было никакой буферизации в любом месте конвейера, выдача заголовка приведет к немедленному завершению работы скрипта. В действительности, это может быть где угодно между «сейчас» и «никогда» для завершения выключения.
Прочитайте больше
да, да, заголовок подобен любой другой части скрипта php, он будет отправлен после завершения выполнения скрипта, однако трюк: если мы хотим перенаправить на новый URL-адрес: тогда зачем продолжать выполнение скриптов после заголовка («location : url "); ?>
<?php header('Location: test.php'); header('Location: test.php'); header('Location: test.php'); header('Location: test.php'); header('Location: test.php'); header('Location: test.php'); header('Location: test.php'); $var = 'google.com'; header("Location: http://$var"); ?>
header("Location: http://example.com/newURL.php"); die;
Да, сценарий продолжается после перенаправления заголовка, поэтому обязательно вызовите die;
или exit;
в любое время, когда вы перенаправляете, чтобы остановить выполнение. Не нужно сбрасывать скрипт :).
Как сделать перенаправление в PHP?
СЦЕНАРИЙ USECASE: перенаправляйте пользователей в портал для записи, затем запускайте таймер обратного отсчета, чтобы записать их из списка блоков через x минут.