缓存jQuery检索的数据

时间:2011-11-07 15:21:22

标签: php javascript jquery caching

我正在使用jQuery的$.ajax方法从API中检索一些JSON。

每次加载页面时,都会调用API,无论用户之前是否收到过此数据 - 这意味着当页面上有大量用户时,API限制将生效。

我想到如何处理这个问题首先是将数据推送到数据库(推送到PHP脚本),然后检查数据库以查看是否有任何缓存,然后再返回API以获取更多信息如果需要,可以提供日期信息。

这是一种可行的方法吗?有哪些替代方案?

看起来jQuery实际上只是一个障碍,而不是在PHP中开始使用它,但是当我正在学习语言时,我想尽可能多地使用它!

2 个答案:

答案 0 :(得分:3)

不,不要在PHP中这样做。使用HTML5 LocalStorage缓存第一个请求,然后进行检查。如果您必须支持旧浏览器,请使用后备(try these plugins)。

答案 1 :(得分:3)

为了帮助区分意见和推荐技巧,让我们首先分解您的问题,以确保每个人都了解您的情况。

假设我们有两台服务器:“服务器A”和“服务器B”。将'Server A'称为我们的PHP Web服务器,将'Server B'称为我们的API服务器。我假设您无法控制API服务器,这就是您单独调用它的原因,并且无法根据您的需求并行扩展API服务器。让我们说它的某些第三方应用程序,如flickr或收获或其他东西......让我们说这个第三方API服务器每小时限制您的开发人员API密钥请求,有效地限制您每小时150个请求。

当你的一个页面加载到最终用户浏览器中时,源代码来自“服务器A”(我们的php服务器),并且该页面正文中有一些很好的jQuery执行.ajax()调用'Server B'是我们的API服务器。

现在,您的开发人员API密钥每小时只允许150个请求,而假设您可能会在一小时内看到1000个请求到您的“服务器A”PHP服务器。那么我们如何处理这种负载的差异,假设我们不能简单地扩展API服务器(如果可能的话,最好的选择)。

在这种情况下,您可以采取以下措施:

  • 正常继续,当jQuery.ajax()返回503服务时 由于限制而导致的不可用错误(大多数第三方API所做的)会礼貌地告诉最终用户 您遇到高于正常的流量并再次尝试 后来。即使你也加入,这也不是一个坏主意 一些缓存。
  • 假设API检索的数据是可缓存的,那么您 可以在PHP服务器上运行代理。这特别好 适用于相同的ajax请求将返回相同的响应 随着时间的推移。 (例如:也许你正在提取一些描述 对于一个对象,同一个对象请求应返回相同的描述响应 一段时间)。这可以是PHP Pass through proxy或a 较低级别的代理,如SQUID caching proxy。对于PHP Pass through proxy,您可以使用“保存到数据库或文件系统”策略进行缓存,甚至可以重新编写过期标头以满足您所需的缓存生命周期。
  • 如果您已确定响应数据可以缓存,则可以 允许客户端也使用缓存ajax响应 缓存:真。 jQuery.ajax()实际上默认使用cache:true,因此您只需将缓存设置为false即可缓存响应。
  • 如果您的响应数据很小,您可以考虑将其缓存在客户端 曲奇饼。但经验说,大多数用户清除他们的临时性 互联网文件也将清除他们的cookie。也许使用jQuery.ajax()的内置缓存也一样好?
  • 用于客户端缓存的HTML5本地存储很酷,但缺乏广泛的流行支持。 如果您控制您的用户群(例如在公司环境中) 也许可以强制使用符合HTML5标准的浏览器。否则,你 对于缺少浏览器,可能需要基于cookie的后备或polyfill HTML5本地存储。在这种情况下,您可能只是重新考虑上面的其他选项。

总而言之,无论您采用何种缓存技术,都应该能够向用户显示友好的服务不可用消息。除此之外,您可以使用API​​响应的服务器端和客户端缓存中的一个或两个来减少影响。服务器端缓存可以将重复请求保存到同一资源,而客户端缓存可以保存同一用户和浏览器对相同资源的重复请求。鉴于所描述的场景,我将避免使用Html5 LocalStorage,因为您需要支持回退/填充选项,这使得内置请求缓存在大多数情况下都同样有效。

正如你所看到的,jQuery不会真正改变这种情况,无论是从PHP服务器端调用API服务器。如果您在服务器端使用PHP执行API调用,而在客户端通过jQuery.ajax()执行API调用,则可以应用相同的缓存技术。当您的容量过大时,应该以这种或那种方式实施相同的友好服务不可用消息。

如果我误解了您的问题,请随时发表评论,澄清和/或修改原始问题。