использование заголовков HTTP для управления кешем в PHP - PullRequest
2 голосов
/ 22 ноября 2011

Как я могу использовать HTTP-заголовки, чтобы контролировать, когда мой кэш должен быть обновлен?

В настоящее время я использую cURL, чтобы получить действующий XML-фид и затем сохранить его в XML-файле.Канал также отправляет заголовки HTTP, уведомляя вас о том, когда он будет обновлен.Обновление может длиться от 30 секунд до 3 минут.

Заголовок выглядит следующим образом

Expires: Mon, 22 Nov 2011 10:01:22 GMT

, и это то, что я сейчас использую для проверки каждые 30 секунд

if (file_exists($filename) && (filemtime($filename) > time() - 30)) {

Я бы предпочел, чтобы оно обновлялось только на основе того, что говорится в заголовках HTTP.

Как мне поступить?

Кроме того, существует ли лучший способ кэширования этого XML-канала, чем сохранениеэто в файл XML?

Ответы [ 2 ]

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

В заголовке Expires указывается время истечения срока действия документа, т. Е. «Не проверять до этой даты».Обратите внимание, что он указывает часовой пояс (GMT), поэтому это может быть не ваше местное время.

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

Прежде всего вам нужно будет проанализировать дату, указанную в заголовках:

$header = "Expires: Mon, 22 Nov 2011 10:01:22 GMT";
preg_match(
    "/Expires: [A-Za-z]+, ([0-9]{1,2}) ([A-Za-z]+) ([0-9]{4}) ([0-9:]+) ([A-Z]{3})/", 
    $header,
    $matches
);
$months = array(
    "Jan" => "01",
    "Feb" => "02", 
    "Mar" => "03",
    "Apr" => "04",
    "May" => "05",
    "Jun" => "06",
    "Jul" => "07",
    "Aug" => "08",
    "Sep" => "09",
    "Oct" => "10",
    "Nov" => "11",
    "Dec" => "12"
);
$day = $matches[1];
$month = $months[$matches[2]];
$year = $matches[3];
$time = $matches[4];
$zone = $matches[5];

$date = new DateTime("$year-$month-$day $time", new DateTimeZone($zone));

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

$now = new DateTime();
if($now > $date);

Вы должны сохранить $ date в файле или БД после того, как вы загрузили XML и проанализировали дату.В следующий раз, когда вы запустите сценарий, просто проверьте сохраненную дату с новым DateTime (), чтобы увидеть, нужно ли вам его обновлять, если нет, вы можете загрузить сохраненный XML из файла.Это хорошо, вы можете сохранить его в базе данных, но я бы не стал создавать БД только для сохранения одной XML-структуры.Если вы хотите сохранить историю старых XML, БД имеет смысл снова.

...