Может ли перенаправление header () идти до того, как исполняется оставшаяся часть PHP-скрипта? - PullRequest
1 голос
/ 20 сентября 2010

Я пишу скрипт перенаправления на PHP, который будет вставлять информацию о клике в базу данных MySQL.

Всегда ли будет вставлена ​​информация, если база данных добавит функцию header () перед вставкой? Я хочу сделать это таким образом, чтобы сделать перенаправление максимально быстрым.

$location = "Location: http://www.example.com";
header($location);

$sql = "INSERT INTO tracking (info) VALUES ('$info')";
$result = @mysql_query($sql, $con) or die(mysql_error());

Я проверил его и он вставил информацию в базу данных. Тем не менее, моя основная проблема заключается в том, что если сервер работает медленно и функция header () завершается до того, как вставка произойдет, сценарий завершится без вставки информации в базу данных.

Или скрипт завершится независимо?

Ответы [ 2 ]

6 голосов
/ 20 сентября 2010

Если вы не хотите ничего запускать:

header('..');
exit;

Если вы хотите быть достаточно уверенным, остальные работают:

header('..');
ignore_user_abort(true);

На самом деле, 301 и 302 могут содержать тело в соответствии с определением HTTP (формулировка "Если метод запроса не был HEAD, объект ответа ДОЛЖЕН содержать короткую гипертекстовую заметку с гиперссылкой на новый URI (s). ") и, действительно, если ваш браузер поддерживает это, вы можете просто (временно) отключить перенаправления и посмотреть фактическую страницу, отображаемую. Будет ли браузер выполнять перенаправление сразу после заголовка или дождаться завершения всего запроса, зависит от самого пользовательского агента. Он будет ожидать всех заголовков, хотя в моем опыте (например, заголовки cookie), поэтому не имеет значения, вызывать ли его до или после начального заголовка перенаправления, но убедитесь, что вы отправили его перед любым содержимым / телом.

Существуют ограничения на использование ignore_session_abort(), обычного тайм-аута самого веб-сервера, и применяются отключения из-за настроек в самом веб-сервере. Если у вас есть процесс, который занимает много времени, вы не должны занимать процесс веб-сервера, когда он не выполняет HTTP-коммуникацию. В этом случае асинхронная система работы, такая как Gearman, может быть больше, чем вы ищете.

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

Да. Редирект может идти раньше.
Нет, вы не можете гарантировать, что он всегда будет вставлять информацию в базу данных. Вы не можете полагаться на это вообще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...