2011-11-22 65 views
2

如何使用HTTP頭來控制何時應更新緩存?在PHP中使用HTTP頭進行緩存控制

目前我正在使用cURL來獲取一個實時XML提要,然後將其保存到一個xml文件中。 Feed還會發送HTTP標題,通知您它何時更新。更新可以在30秒到3分鐘之間。

頭看起來像這樣

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

,這是我目前使用的檢查每一個30秒

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

我會喜歡它只能基於HTTP頭說些什麼更新的東西。

我該怎麼做呢?

也有更好的方式來緩存這個XML提要,而不是將它保存到XML文件嗎?

回答

0

首先你必須分析在頭信息中給出的日期:

$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)); 

,那麼你可以檢查此與實際時間,只有執行更新,如果達到從上次更新$日期

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

您下載的XML解析和日期後,你應該保存在一個文件或數據庫的$日期。 下一次執行腳本時,只需根據新的DateTime()檢查保存的日期以查看是否已經更新它,如果不是,則可以從文件加載保存的XML。

將XML保存爲文件很好,可以將它保存到數據庫,但我不會爲保存一個XML結構而設置數據庫。如果您想保留舊的XML歷史記錄,則數據庫將再次有意義。

+0

請注意,這將已經使用正確提供的時區。 – zuloo

+0

好吧,但我怎麼只抓住過期:星期一,2011年11月22日10時01分22秒,而不是所有的頭? –

+0

只是放在完整的標題,正則表達式應該只是符合過期的東西線... – zuloo

0

Expires標題告訴你文檔將到期的時間 ​​- 即「不檢查直到這個日期」。請注意,它指定了時區(GMT),因此這可能不是您當地的時間。

+0

,它總是應該是GMT + 0,所以它可以易於調整到服務器時區 – Esailija

+0

@Esailija:好點 - 強調「應該是」; 99%的服務器將遵循RFC;有些人不會。至於GMT + 0,這並不是什麼大問題,例如對於格林威治標準時間-5的人來說,由於差異很大,所以很明顯,但是作爲格林威治標準時間+1的人,沒有意識到偏移至少咬了我一次。 – Piskvor