消除Excel文档的缓存

时间:2010-02-10 15:57:21

标签: php excel caching

我有一个PHP脚本,只需要一些数据,将其分成制表符分隔格式,将其保存为.xls文件,然后为用户提供下载链接。

大部分时间都运行良好,但有些人正在获取导出的.xls文件的缓存版本。

我想我需要做的不是给用户直接链接到.xls文档,而是给他们一个PHP页面的链接:

deliver_excel_doc.php文件= some_excel_file.xls&安培;吗

然后 deliver_excel_doc.php 从excel文档中提取数据,但是使用标题执行某些操作,因此excel doc不会被缓存,然后输出为xls,因此文件将被下载(或在内部呈现) Excel文件)。

关于我如何做到这一点的任何想法(这个概念是否可行)?

3 个答案:

答案 0 :(得分:6)

您可以在编写时对您的网址进行版本控制,但不要这样做,请发送正确的标题:

<?php
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
?>

答案 1 :(得分:3)

只需在获取Excel文件的链接中添加时间戳,例如

printf('<a href="file.xls?%d">Excel File</a>', time());

由于时间戳总是不同,因此他们的浏览器不会缓存文件。

答案 2 :(得分:2)

如果客户端正在缓存PHP的输出,那么你遇到的问题比你想象的要大得多!

erenon部分正确地设置了缓存说明,但是如果你使用过期的缓存日期提供它,那么你会发现Excel经常无法打开文档(如果它通过MSIE访问)。更好的解决方案是在将来设置一个到期时间仅几秒钟,并要求代理不要缓存它:

if ($_SERVER['SERVER_PROTOCOL']=='HTTP/1.0') {
    header("Expires: " . date('r', time()+3));
} else {
    header("Cache-Control: max-age=3, private, must-revalidate");
}

虽然HTTP / 1.1将支持Expires标头,但为了使其按预期运行,客户端时钟必须与服务器时钟同步。

(请注意,如果您未设置时区,则date()会抛出警告)

下进行。