【问题标题】:Detecting if a browser's cache is full检测浏览器的缓存是否已满
【发布时间】:2010-05-14 15:09:03
【问题描述】:

我们发现,完整的浏览器缓存是我们外联网出现问题的原因。它只会影响我们的一小部分用户,但我们希望提醒他们注意这个问题,并为他们提供一些关于如何自己解决问题的指导。

我们希望使用与 GMail 使用的系统类似的系统。当它检测到您的浏览器的缓存 已满 没有正常运行时,它会显示一条警告消息,告诉用户他们的缓存已满,并且可能会导致 GMail 出现问题,并附有指向Gmail Help page on clearing your browser's cache.

有谁知道那里是否有任何资源,或者如何使用 JavaScript 来检测浏览器的缓存 full 表现不佳的示例?

谢谢。


澄清:我想,我们实际上试图检测的不是缓存是否已满,而是我们已配置服务器端存储的脚本是否已满在缓存中,正在从服务器重新请求 - 浏览器行为异常,或者好像它的缓存没有正常运行。


进一步说明:感谢大家对缓存的更新。我们的脚本使用正确的标头发送,我们只在 IE6 和 IE7 中看到这个问题 - Mozilla 和 WebKit 浏览器似乎不受影响 - 但我仍然不确定我们将如何使用 JavaScript 和/ 或 XmlHttpRequest 来检查是否从缓存中检索到对象,从而让我们检查缓存是否表现不佳。

【问题讨论】:

  • 独立地这是否真的可能(我怀疑),浏览器缓存何时被认为已满,因为它基本上是一个队列,当需要空间时,最旧的数据被删除。或者什么时候没有满?未满将需要用户定期清空它,这是大多数人从未做过的......
  • 我很好奇您是如何以及为什么确定 full 缓存是问题所在,而不是缓存中的数据冲突或类似问题。无论如何,如果您是在 comp.lang.javascript (groups.google.co.uk/group/comp.lang.javascript/browse_thread/…) 上被滥用的同一个人,我希望您在 stackoverflow 上得到更好的待遇...
  • 嘿...不,那不是我在 comp.lang.javascript 上的。我想我真正要问的是,GMail 正在做些什么来检测您的浏览器的缓存已已满,并将此消息显示给我们的最终用户。通过您的链接,并通过快速阅读,我设法找到了这个讨论 (groups.google.com/group/comp.lang.javascript/browse_frm/thread/…),它解释了可能发生的事情以及如何去做。谢谢!
  • @RoToRa:我想我们实际上试图检测的不是缓存是否已满(像你一样,我不确定是否真的可以这样做,因此问题)而是我们已将服务器端配置为存储在缓存中的脚本是否正在从服务器重新请求 - 浏览器的行为就好像其缓存已满。
  • 看起来 gmail 缓存已满警告仅通过 http 显示。我已阅读有关使用 https 浏览 gmail 时消息消失的报告。 Source

标签: javascript caching gmail xmlhttprequest


【解决方案1】:

浏览器的缓存不会在已满时引起问题...有一些小注释。

  1. 如果浏览器缓存已满,浏览器只需下载新内容,而不是从本地缓存中提取内容。 (例如更慢)
  2. 如果浏览器缓存包含无效数据(例如 JavaScript 文件的旧副本),那么是的,您可能会遇到问题。 (不是因为缓存已满,而是因为您没有为用户提供新文件(Google for:expires headers 以及如何在更改脚本以确保您“中断”时更改文件的 URL 路径)缓存))
  3. 在 Internet Explorer 中,当您将下载文件(例如 Excel 电子表格)推送给用户时,它必须进入缓存才能工作(IE 错误) - 我不确定文件大于用户的总缓存,如果这会导致文件被存储并因此加载问题(堆栈者请随时确认这是一种方式还是另一种方式)

更新: 根据您的说明,您需要确保您发送给客户端的任何脚本都被适当地缓存...这意味着:

  • 当您想要下载新版本时更改脚本的 URL(例如)
  • 一旦您确定 URL 发生变化,您可以发送缓存标头,告诉浏览器将文件缓存很长时间(例如,您的 JS 库文件(例如 jQuery)可能不会每小时、每天更改一次,一周甚至一个月)

【讨论】:

  • 鉴于此,您是否建议等到页面完成加载,然后对我们在<head> 部分中加载的相同脚本(标题)发起异步请求页面,然后检查它是从缓存加载还是从服务器加载?
【解决方案2】:

这可能不会按原样工作。但这只是一个想法:

var img = new Image();
(new Image).src = "imageWithFarFutures.png";
window.onload = function(){
    document.getElementById("someIframe").src = "imageWithFarFutures.png";
    // NOW if the server DOES get a FRESH request for "imageWithFarFutures.png"
    // wouldn't it mean that the browser has kicked it out of its cache?
};

【讨论】:

    【解决方案3】:

    考虑发送一个标头以使您的应用程序永远不会缓存您的内容并使其立即过期。

    【讨论】:

    • 为什么?这完全违背了我们的意图——我们希望缓存这段特定的内容。
    猜你喜欢
    • 1970-01-01
    • 2012-04-09
    • 2014-08-07
    • 2012-03-01
    • 2017-08-24
    • 1970-01-01
    • 2010-09-23
    • 1970-01-01
    相关资源
    最近更新 更多