在PHP中使用HTTP头进行缓存控制

在PHP中使用HTTP头进行缓存控制,php,caching,http-headers,browser-cache,cache-control,Php,Caching,Http Headers,Browser Cache,Cache Control,如何使用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头来控制何时更新缓存

目前,我正在使用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文件中?

首先,您必须解析标题中给出的日期:

$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);
下载XML并解析日期后,应将$date保存在文件或数据库中。 下次执行脚本时,只需对照新的DateTime()检查保存的日期,查看是否已经需要更新它,如果不需要,则可以从文件中加载保存的XML


将XML保存为文件很好,您可以将其保存到数据库中,但我不会仅为保存一个XML结构而设置DB。如果您想保留旧XML的历史记录,DB将再次发挥作用。

首先,您必须解析标题中给出的日期:

$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);
下载XML并解析日期后,应将$date保存在文件或数据库中。 下次执行脚本时,只需对照新的DateTime()检查保存的日期,查看是否已经需要更新它,如果不需要,则可以从文件中加载保存的XML


将XML保存为文件很好,您可以将其保存到数据库中,但我不会仅为保存一个XML结构而设置DB。如果您想保留旧XML的历史记录,DB将再次发挥作用。

过期标题告诉您文档将过期的时间,即“在此日期之前不要检查”。请注意,它指定了时区(GMT),因此这可能不是您的本地时间。

过期的
标题告诉您文档将过期的时间,即“在此日期之前不要检查”。请注意,它指定了时区(GMT),因此这可能不是您的本地时间。

从开始,它总是假定为GMT+0,因此可以轻松地根据服务器进行调整timezone@Esailija:好的观点-强调“应该”;99%的服务器将遵循RFC;有些人就是不会。至于GMT+0,这不是什么大问题,例如,对于GMT-5中的某个人来说,差异大到可以明显看出,但是对于GMT+1中的某个人来说,没有意识到偏移量至少咬了我一次。从开始,它总是应该是GMT+0,因此可以轻松地根据服务器进行调整timezone@Esailija:好的观点-强调“应该是的"; 99%的服务器将遵循RFC;有些人就是不会。至于GMT+0,这不是什么大问题,例如,对于GMT-5中的某个人来说,差异大到可以明显看出,但是对于GMT+1中的某个人来说,没有意识到偏移量至少咬了我一次。请注意,这已经正确使用了提供的时区。好的,但是我如何获取过期时间:Mon,2011年11月22日10:01:22 GMT,不是所有的标题吗?只需输入完整的标题,正则表达式就应该与expires内容的行匹配…只是刚刚有时间测试它,我得到了一个致命错误。致命错误:未捕获异常“exception”,消息为“DateTime::\u construct()[]:依赖系统的时区设置是不安全的。您需要使用date.timezone设置或date\u default\u timezone\u set()函数。如果您使用了这些方法中的任何一种,但仍然收到此警告,则很可能是您拼错了时区标识符。我们选择“美国/洛杉矶”作为“PST/-8.0/无DST”,而不是“您可以设置
$now=new DateTime(“now”,new DateTimeZone(“GMT”)
并将GMT替换为您的本地时区,如德国的
欧洲/柏林
UTC
或其他…注意,这将已经正确使用提供的时区。好的,但如何获取过期时间:2011年11月22日星期一10:01:22 GMT,而不是所有的标题?只需输入完整的标题,正则表达式应该只匹配行和expires的内容…只是刚刚有时间测试它,我得到了一个致命的错误。致命错误:未捕获异常“exception”,消息为“DateTime::\u construct()[]:依赖系统的时区设置是不安全的。您需要使用date.timezone设置或date\u default\u timezone\u set()函数。如果您使用了这些方法中的任何一种,但仍然收到此警告,则很可能是您拼错了时区标识符。我们选择“美国/洛杉矶”作为“PST/-8.0/无DST”,而不是“您可以设置
$now=new DateTime(“now”,new DateTimeZone(“GMT”)
并将GMT替换为您的本地时区,如德国的
欧洲/柏林
,或
UTC
或其他。。。