【问题标题】:Problem with PHP aplication updates because of the browser cache由于浏览器缓存导致 PHP 应用程序更新出现问题
【发布时间】:2011-04-23 17:30:47
【问题描述】:

我们有一个 PHP 应用程序。当我们在此应用程序中进行更新和更改时,问题就出现了。有时,由于浏览器缓存,用户无法获得应用程序的最新版本(主要更改 HTML 和 javascript)。一旦我们意识到这一点,我们就可以在我们的应用程序中包含下一个代码(我们在任何 HTML 发送到浏览器之前执行它)

function clean_cache(){
    header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
    header( "Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT" );
    header("Cache: no-cache");
    header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
    header("Cache-Control: post-check=0, pre-check=0", false);
    header("Pragma: no-cache");
}   

但我们仍然有一些用户使用旧版本的应用程序。 我们读到一个可能的解决方案是使用 javascript 通过 ajax 询问服务器是否有更新。如果是这样,请强制重新加载。如果这是解决我们问题的最佳方法:我们如何实施此解决方案?如果您有任何其他可能的解决方案,我们将很高兴知道。

谢谢

【问题讨论】:

  • 我的猜测是正在查看“旧”版本程序的用户有 IE。因此 ajax 也是我的选择,因为如果您单击重新加载按钮,IE 有时甚至不会尝试重新加载页面,因此不会注意到更改。
  • 定义“应用程序的最新版本”。这是否与 HTML 代码、JavaScript 或 CSS 资源或图像有关?
  • 我编辑了它。但主要是这可能是我们需要做的任何改变:HTML 或 javascrpt,但我们也计划添加图像,这可能会在接下来的几周内成为问题。

标签: php ajax caching reload


【解决方案1】:

将上次更新存储在变量中,并使用 ajax 每分钟执行一次 ajax 请求,并检查更新时间是否与变量中存储的更新时间不同。如果是这样,请使用 window.location = "the new location";

重新加载

编辑:

它应该看起来像这样: (但我没有测试它,所以我不保证它可以工作)

var updateTime = '<?php echo $lastUpdateTime;?>';
$(document).laod(function(){
    var reload = window.setInterval("request()", 60000);
});

function request(){
    $.get("last_update.php", function(data){
        if(updateTime != date) window.location = "redirect_to.php";
    });
}

编辑 2: 这是包含 jquery 的 HTML:

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script> 

这个"redirect_to.php" 是您将窗口重定向到的文件。因此,如果您想留在同一个网站上,只需将网站的网址放在那里即可。

&lt;?php $lastUpdateTime;?&gt; 是有点错误的内联 PHP。我将其更正为&lt;?php echo $lastUpdateTime;?&gt;

last_update.php 只是一个返回最后更新的页面。如何跟踪上次更新取决于您。

【讨论】:

  • 我不太明白该怎么做。
  • 查看我的编辑。顺便说一句,您需要包含 jquery 源才能使用我的示例!
  • 非常感谢您澄清我的疑问。 last_update.php 里面应该有什么?我们不跟踪更新,我们只是在应用程序中进行请求的更改。
  • 那么您应该开始跟踪您的更改,至少以您将最后一次更改的日期和时间放入 last_update.php 的方式
  • 我们是否应该创建一个last_update.php 文件并在其中写入日期和时间?只是这个?谢谢
【解决方案2】:

IE 缓存来自同一 URL 的文件,假设您正在从 html 标头加载 js 文件,您可以尝试随机化 url 中的查询号,只是为了强制 IE 将其解释为新 URL 并重新加载它。

例子:

<?php 
    $random = rand(1, 100000);

?>
<head>
<script type="javascript/text" src="../js/foo.js?v=<?php echo $random;?>"></script>
</head>
...

这将输出类似

<script type="javascript/text" src="../js/foo.js?v=5"></script>

如果您确定 URL 是“动态的”,IE 将被强制重新加载它。

【讨论】:

  • 问题不仅出在 IE 上,我们在 Mozilla 也遇到过问题。
  • 我认为最好附上当前时间描述符而不是随机数。生成随机数需要更多时间,有时会发生冲突,当前时间总是新的(包括毫秒的时间)。干杯。
猜你喜欢
  • 1970-01-01
  • 2013-09-27
  • 2013-10-01
  • 1970-01-01
  • 2014-05-26
  • 1970-01-01
  • 2014-05-22
  • 2012-06-19
  • 1970-01-01
相关资源
最近更新 更多