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