我正在使用简单的jQuery DIV刷新代码。
var refreshId = setInterval(function() { $( '#refreshdash')负载( 'dashboard.php缓存=?'); },4000);
右?有人告诉我,在你要刷新的文件末尾加上“?cache =”会有助于降低带宽等,因为他告诉我它会缓存文件或类似的东西。
我真的不相信他。这是真的? ......如果没有,那实际上做了什么,什么都没有?答案 0 :(得分:5)
不,这实际上恰恰与发生的情况完全相反。
浏览器根据其网址缓存内容。通过在URL的末尾添加额外的查询参数,您实际上正在更改从中获取的位置,因此,如果内容已更改,则强制浏览器重新请求内容。因此,在末尾添加cache=x
参数是一种称为缓存破坏的技术。
例如:
http://example.com/index?timestamp=100
http://example.com/index?timestamp=567
这些网址可能会返回相同的内容,但它们是不同的网址,因此会单独缓存。
常见的缓存破解技术是将当前时间戳添加到URL,因为这将始终在变化,确保每次都生成新的URL。
但是,这会增加带宽,而不是减少带宽,因为浏览器每次都需要重新获取您的内容。
此方法的最佳用途是静态文件很少更改,但可能会被代理服务器或其他HTTP缓存长时间缓存。我将其用于.js
和.css
个文件。我会将文件的最后修改时间附加到URL ...每当文件更新时,URL都会更改,浏览器知道会重新获取它们。
答案 1 :(得分:1)
如果您将带有随机字符串的查询字符串(如?cache =)放到URL的末尾,它将阻止缓存。对于对该URL发出的每个请求,它都会强制向服务器进行新的往返。
有更多信息,请here
答案 2 :(得分:1)
是的,当你想阻止浏览器缓存结果时,传递一个随机变量(比如当前的时间戳+一些哈希)是有帮助的。但你必须像“?cache = your_random_variable”一样使用它(例如:?cache = abc9623498385023)。
答案 3 :(得分:1)
默认情况下,动态页面永远不会缓存,因为php会发送标题以使页面不被缓存。您可以发送相应的标题以使页面被缓存,但默认情况下不会。
您可以使用Firebug的Net Panel进行测试。它会告诉你是否从缓存中加载了某些内容。
答案 4 :(得分:1)
通常,此技术主要用于静态内容。
您的脚本返回标头告诉浏览器长时间缓存 - 这会降低带宽,因为浏览器将使用缓存副本,而不是请求新的副本。非常适合javascript库,徽标,CSS文件等。
缺点是当你改变事物时,人们不会看到它们,因为它们已被缓存。当你有依赖关系时 - 例如一个新的javascript小部件库,这取决于你的CSS文件的新版本或另一个javascript文件,这可能会更糟。如果只加载一个,页面可能看起来/工作不正常。
对此的一个半解决方案是将到期时间设置为平衡时间,例如一天,以便每个人最终都会请求新内容(由于每天至少抓取一次内容而略微增加带宽) 。但是,这并不能解决依赖性问题。
使用随机参数(?cache =)是解决此问题的绝佳方法。基本上,服务器忽略参数,但对于浏览器,不同的参数意味着不同的URL。您的主站点可以知道内容何时更改,从而更改参数值,强制浏览器刷新,在它发生更改的瞬间(假设您的代码没问题,则不会出现过时的缓存或依赖性问题)。
参数名称无关紧要,它的值也不重要 - 显然你想避免服务器解释的东西。这个mechansim的热门选择: *文件的md5(缓存此服务器端,因为计算起来可能很昂贵) *文件的日期/时间,或日期/时间的哈希值 *文件或整个站点的版本号(如果每次部署任何新内容时增加版本)
Theres博客文章介绍了他们如何做caching on stackoverflow。
我见过的另一种情况是部署到服务器,默认情况下会发送导致内容缓存的标头,例如,一些托管服务提供商用来执行此操作(可能仍然这样做,但我还没有看到问题个人十年)。通过设置?cache =你可以解决这个问题。这里真正的解决方案是默认情况下使您的服务器不缓存,如果这对您的使用没有意义。