在PHP中使用HTTP头进行缓存控制
如何使用HTTP头来控制何时更新缓存 目前,我正在使用cURL获取一个实时XML提要,然后将其保存到一个XML文件中。 提要还发送HTTP头,通知您何时更新它。更新时间可以在30秒到3分钟之间 标题看起来像这样在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)) { 我希望它
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
或其他。。。