Почему заголовок Location не перенаправляет страницу немедленно? Он всегда выполняет весь процесс перед перенаправлением?
Я приведу пример:
header('Location:http://www.php.net'); $f = fopen('demo.txt','w+'); fwrite($f,'Test'); fclose($f);
Он всегда генерирует файл TXT перед перенаправлением на http://www.php.net
.
Ну, header()
просто отправляет определенный заголовок в браузер. После этого PHP все еще обрабатывает скрипт. Если вам это не нравится, просто используйте die;
или exit;
– он перестанет обрабатывать сценарий дальше.
Это потому, что функция header()
не перенаправляет, она отправляет заголовок. Браузер может (теоретически) полностью игнорировать его и продолжать продолжать синтаксический анализ страницы. Если вы хотите, чтобы скрипт не обрабатывался после отправки заголовка, немедленно выполните команду die()
или exit()
.
Почему заголовок Location не перенаправляет страницу немедленно?
Просто потому, что он не перенаправляет что-либо вообще. Это браузер, который будет тормозить текущее соединение (что приведет к остановке скрипта) для запроса другой страницы. И есть сетевая латентность.
Он всегда выполняет весь процесс перед перенаправлением?
Не всегда. Это просто не гарантировано.
Мне действительно нужно, чтобы процесс продолжал прикреплять местоположение заголовка, чтобы завершить работу системы и создать журналы
с mod_php вам потребуется ignore_user_abort()
а с php-fpm это fastcgi_finish_request()
чтобы гарантировать полное выполнение скрипта.