Через сколько времени после отправки команды заголовка ('Location: ...') скрипт PHP будет обрабатываться? - PullRequest
1 голос
/ 04 ноября 2011

У меня есть два PHP-скрипта, у каждого из которых есть "include_once ('authentication.inc');"Сценарий в верхней части.Оба сценария ссылаются на один и тот же файл аутентификации.Этот файл аутентификации в настоящее время выполняет перенаправление заголовка (например, "header ('Location: index.php');"), если пользователь не вошел в систему.

В одном файле (A.php) непосредственно следующая строкакода после включения файла аутентификации:

if(isset($_GET['delete']))
   mysql_query("DELETE FROM table WHERE index=".$_GET['delete']);

В другом файле (B.php) есть несколько других включений, которые происходят до того же "удаления кода", указанного выше.

Итак, файл authenticate.inc выглядит так:

if(!valid_credentials($username,$password))
    header('Location: index.php');

А файл A.php выглядит так:

include_once('authenticate.inc');

if(isset($_GET['delete']))
   mysql_query("DELETE FROM table WHERE index=".$_GET['delete']);

А файл B.php выглядит так:

include_once('authenticate.inc');

include_once('other.php');
include_once('file2.php');
include_once('onemore.php');

if(isset($_GET['delete']))
   mysql_query("DELETE FROM table WHERE index=".$_GET['delete']);

Тем не менее, когда я вызываю A.php? Delete = 5, эта запись удаляется из базы данных, а когда я вызываю B.php? Delete = 8, эта запись не выполняется.

Я проверил 3посредник включает и не видит ни операторов die (), ни каких-либо других перенаправлений заголовков.

Поэтому, хотя ясно, что A.php продолжает выполняться после отправки заголовка, почему B.php не выполняеттоже самое?Отправляется ли заголовок до следующего набора импортов?

**

Также: я знаю, что добавить команду die () или exit после отправки заголовков.Я работаю над чужим кодом и пытаюсь объяснить поведение, а не пишу это сам.

**

Ответы [ 5 ]

4 голосов
/ 04 ноября 2011

Невозможно сказать. Если старты выровнены правильно, заголовок сразу же будет отправлен в браузер клиента, и дроузер начнет закрывать текущее соединение и немедленно запросит новый URL. Это приведет к закрытию текущего PHP-скрипта.

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

В общем, вы должны исходить из того, что в тот момент, когда вы произвели перенаправление заголовка, скрипт в основном «ходячий мертвец» и не должен выполнять никакой дальнейшей работы.

Единственным исключением из этого правила является то, что вы МОЖЕТЕ использовать ignore_user_abort(TRUE), что говорит PHP о НЕ выключении при отключении удаленного пользователя. Это позволило бы вам продолжить работу, даже если браузер отключил соединение и перешел на новую страницу.

2 голосов
/ 04 ноября 2011

Обновите файл authenticate.inc до die() после перенаправления. Это предотвратит выполнение любого другого кода.

if(!valid_credentials($username,$password)) {
    header('Location: index.php');
    die();
}

Без этого и в зависимости от конфигурации вашего сервера остальная часть кода PHP будет выполняться на сервере даже после того, как заголовки переданы обратно клиенту. Пока клиент не закроет соединение, код будет выполняться.

1 голос
/ 04 ноября 2011

Вероятно, есть какой-то вывод в любом из включенных файлов, с echo или другими функциями вывода. Если к тому времени браузер выполнил перенаправление и прервал соединение, скрипт PHP по умолчанию завершит работу. Вы можете изменить это поведение с помощью ignore_user_abort(true);. Однако вы должны использовать die(); после заголовка Location. Если требуется выполнение запроса, просто поместите этот запрос перед заголовком Location. Не забудьте использовать правильное экранирование для ввода, в противном случае сценарий может стать целью для атаки с использованием MySQL.

1 голос
/ 04 ноября 2011

Просто поставьте выход () после перенаправления заголовка.Он остановит все выполнение после перенаправления.

0 голосов
/ 04 ноября 2011

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

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

Что касается не удаляющего id = 8 - просто отладьте его. Ничего страшного.
Хороший var_dump () всегда лучше, чем некоторые смутные представления о заголовках.

...