Можно ли настроить PHP так, чтобы он никогда не кэшировал ответ и всегда отправлял что-то свежее на страницу? - PullRequest
2 голосов
/ 01 июля 2011

У меня есть веб-страница, которая извлекает новостную ленту XML, и я не хочу, чтобы страница кэшировала ее, чтобы отображаемая новостная лента XML была самой последней.

Я уже пробовал, чтобы кэш сбрасывался каждые 1800 секунд:

$header[] = "Cache-Control: max-age=1800";

Не похоже на работу.

Так что же я могу сделать, чтобы веб-страница автоматически обновляла XML в PHP?

Ответы [ 5 ]

1 голос
/ 01 июля 2011

Попробуйте это,

<?php
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
?>

Это предотвратит кэширование страницы на компьютере пользователя.

1 голос
/ 01 июля 2011

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

Если вы не можете сделать почтовый запрос, добавьте что-то уникальное в часть запроса-информации URI запроса, например, текущее время:

old: http://exmaple.com/data.xml
new: http://exmaple.com/data.xml?878621387
                                  ^ random number

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

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

  function nocache_headers() {
      @ header('Expires: Wed, 11 Jan 1984 05:00:00 GMT');
      @ header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
      @ header('Cache-Control: no-cache, must-revalidate, max-age=0');
      @ header('Pragma: no-cache');
  }

Он устанавливает заголовок Expires на дату в прошлом.Таким образом, при доставке срок действия документа уже истек или в условиях кэширования составляет устаревший .Эти документы не должны доставляться кэшем.

Тогда заголовок Last-Modified устанавливается на текущее время.

Затем Cache-Control заголовок установлен, чтобы сигнализировать, что кэши не должны кэшировать ответ, должны повторно подтвердить и должны хранить копии в течение максимального возраста 0 .Возможно, это звучит немного шизофренично (как будто не кешировано, не может быть возраста), но это просто для того, чтобы прокси-серверы и пользовательские агенты заполняли данными, чтобы они остановились.Заголовок 1036 * установлен в no-cache для предотвращения кэширования также для HTTP / 1.0-совместимых прокси и пользовательских агентов (клиенты HTTP / 1.1 обычно используют Cache-Control).

Все эти заголовкиподробно описаны в протоколе передачи гипертекста - HTTP / 1.1 RFC 2616 Fielding, et al.Раздел 14 Определения полей заголовка , если вы хотите проверить доступные варианты.

1 голос
/ 01 июля 2011

Обычно в php я устанавливаю следующие заголовки, чтобы избежать кеширования:

header( 'Cache-control: no-cache' );
header( 'Cache-control: no-store' , false );
header( 'Pragma: no-cache' );
header( 'Expires: 0' );

Но не понятно, что ты делаешь. Вы вызываете страницу php, которая выводит xml?

На стороне клиента, я обычно добавляю параметр (& time = actualtimestamp) к каждому запросу, чтобы браузер не кэшировал его.

0 голосов
/ 01 июля 2011

Ну, вероятно, вам не нужно устанавливать его в php / perl / .. вы также можете использовать конфигурацию htaccess или apache.Один пример, который я использую для htaccess: http://snipplr.com/view/4265/cache-control-with-htaccess-expires-by-type/

0 голосов
/ 01 июля 2011

Как вы запрашиваете XML-файл? Возможно, с помощью cURL или url fopen, верно?

Оба эти метода не кэшируют ответ, если вы явно не попросите их об этом. Так что с тобой все будет в порядке.

...