2011-11-22 26 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