【问题标题】:website update cache网站更新缓存
【发布时间】:2012-01-14 03:54:57
【问题描述】:

如果您有一个实时网站(使用 PHP、MySQL、JS、CSS)并说您更改了某些功能。确保当用户访问该站点时,更改的页面得到更新而不是从缓存中加载的最佳方法是什么?

【问题讨论】:

    标签: php javascript mysql html css


    【解决方案1】:

    为此,有文件加载器。当你加载 css、js 或任何其他文件时,你必须设置缓存控制头。您可以通过编辑 .htaccess 或使用 php 来完成。

    .htaccess演示

    <IfModule mod_expires.c>
    ExpiresActive On
    ExpiresDefault A300
    ExpiresByType image/x-icon A2592000
    ExpiresByType application/x-javascript A3600
    ExpiresByType text/css A3600
    ExpiresByType image/gif A604800
    ExpiresByType image/png A604800
    ExpiresByType image/jpeg A604800
    ExpiresByType text/plain A300
    ExpiresByType application/x-shockwave-flash A604800
    ExpiresByType video/x-flv A604800
    ExpiresByType application/pdf A604800
    ExpiresByType text/html A300
    </IfModule>
    

    PHP演示:

     $offset = 3600 * 24;
     $expire = "Expires: " . gmdate("D, d M Y H:i:s", time() + $offset) . " GMT";
     header($expire);
    

    【讨论】:

    • 别忘了安装 mod_expires 到 apache。许多主机不支持它。
    • 感谢您的回复!看起来这可能是解决方案。数字是干什么用的? A300等,是多少秒缓存呢?
    • @George 是的。你可以阅读更多httpd.apache.org/docs/1.3/mod/mod_expires.html
    • 是的。对于您服务器中的任何文件。
    • 当我在 Firefox 中上传图片时。它工作得很好,但是当我在谷歌浏览器上上传图片时,它不会更新图片。我必须刷新浏览器才能更新。知道为什么吗?
    【解决方案2】:

    通过 HTML,在 Head 部分放置...

    <META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE">
    <META HTTP-EQUIV="Pragma" CONTENT="no-cache">
    <META HTTP-EQUIV="Expires" CONTENT="-1">
    

    【讨论】:

    • 有趣,我从未听说过。如果可以的话,它是否总是加载一个新页面?
    • 是的,Expires 元数据指定页面已经过期,无法从缓存中加载。但是它永远不会缓存,所以即使页面没有改变,它仍然会从服务器请求一个新的
    • 如果内容保持不变,将所有内容都设置为不一直缓存是个坏主意。
    【解决方案3】:

    如果每个浏览器都符合标准,您无法真正控制每个浏览器的策略,但通常会发生的是浏览器在决定是否应该从缓存加载或重新下载之前从每个 HTML 下载标题.

    查看RFC HTTP 1.1 Header Field 了解更多详情(特别是在缓存控制下)

    【讨论】:

      【解决方案4】:

      除非您有某种形式的缓存,否则用户将请求数据并检查它是否已更新。通常你的 PHP 不会被缓存,除非你有主动缓存。

      您的 JS 和 CSS 必须通过 Apache(或您使用的任何 Web 服务器)下的 HEADERS 设置。

      【讨论】:

        【解决方案5】:

        你可以使用 window.applicationCache.swapCache();和 window.location.reload();在 javascript 确认网站有更新版本后强制重新加载页面。

        更好的选择可能是以某种方式提示用户,让他们知道网站已更新。这样,页面不会突然重新加载。

        function updateCache(){
            window.applicationCache.swapCache();
            window.location.reload();
        }
        
        window.applicationCache.addEventListener("updateready", updateCache, false);
        

        【讨论】:

        • 缓存控制必须通过 HEADERS 而不是 javascript。
        • 这将与 一起使用。我对你所说的感到困惑。
        • 您的解决方案仅适用于新闻可能很快就会出现的实时网页。或秒。但是你将如何为图像设置缓存?而window.applicationCache 只适用于html5。
        猜你喜欢
        • 2019-11-13
        • 1970-01-01
        • 1970-01-01
        • 2015-08-26
        • 1970-01-01
        • 2018-04-09
        • 2018-10-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多