我正在寻找缓存和ajax加载页面的大师: - )
我已经阅读了很多有关该主题的输入,但仍然不确定缓存ajax页面的最佳方法是什么。我想确保尽我所能尽可能快地制作我的iPhone网络应用程序以加载和导航。
这就是我的所作所为: 我正在开发一个带有jqtouch和phonegap的iPhone网络应用程序。 当从App Store下载时,我在应用程序中包含所有js文件,css文件,索引页面和菜单图标。 js和css文件缩小了。
我的所有子页面都是从我的专用服务器加载ajax。 所有子页面都是.asp页面,每次加载页面时都会从mysql数据库中获取其内容。
由于iPhone缓存页面我必须在访问它们时删除所有ajax页面,否则更新将不可见。这不是最好的做事方式。
相反,我不想删除ajax页面并使用cache-controll。
这就是我认为应该如何运作的方式: 打开服务器上的cache-controll(这是怎么做到的?) 在应用程序中,检查Last-Modified日期以及它是否未更改 - 从缓存中读取。 如果更改了 - 从服务器获取文件。
这是最好的做事方式吗?而不是电子标签?
我想知道,如何使用正确的缓存控件将IIS 2008设置为Windows 2008服务器。如何在索引文件中编写正确的头文件,如果我需要在asp的ajax页面中编写som asp-read头文件?
我希望有人现在怎么做? 感兴趣的任何输入,谢谢!
答案 0 :(得分:2)
对我来说,iPhone在本地缓存页面并且你必须清理缓存以获取新内容听起来很奇怪。
实际上必须有一些HTTP缓存标头告诉iPhone浏览器这样做。 如果浏览器是iOS上的Safari,Android上的Opera或Windows上的Firefox,那应该没关系,因为所有现代浏览器都应该"符合HTTP 1.1 RFC,甚至是移动版。 当然,他们可能会有一些差异来节省带宽,手机电池和手机CPU周期,但他们肯定应该允许用户从网站获取新鲜内容。所以我同意你的意见,清理访问过的页面并不是正确的做事方式。 我绝对认为某处存在问题。尝试通过计算机浏览器调用API并通过firebug或chrome的本机调试工具检查请求,以检查服务器响应标头,并查看行为是否相同。
通常我使用max-age和if-modified-自缓存验证器的混合。 我将某些图像的最大年龄设置为较高的值(在我的情况下为365天,很可能不适合您),对于其他一些图像和一天的css和javascript。 另外我使用if-modified-since所以我在内容的新鲜度,服务器负载和带宽使用之间取得了很好的平衡。 ETAG与if-modified-based基本相同,因为差异你可以将它设置为弱缓存验证器,如果服务器的时钟不可靠,它真的很有用。 (有关详细信息和文档参考,请参阅下面的扩展答案)
要启用缓存,IIS7使您可以使用输出缓存IIS模块轻松实现。 Here is一个关于它的好文档,关于如何启用它,以及内核和用户模式缓存之间的区别。
除非你需要做特别的事情,否则我认为你不需要为它创建代码,IIS会处理所有事情。如果情况并非如此,那么another good guide会帮助您解决问题。
如果您真的想要一个快速网站,那么我建议您启用压缩,并在应用程序和数据库之间添加缓存层。因此,您不会在每次请求时对DB执行查询。
以下是任何网络开发者的some more good performance guidelines。
扩展答案(甚至可能过于扩展:))
通过HTTP 1.1有不同的方法在客户端缓存内容。 最常见的,或至少我最常用的是:
1)max-age头从服务器发送到HTTP响应头,并且基本上告诉客户端的浏览器将内容存储在其缓存中,持续一段时间以秒为单位。 / p>
例如,假设服务器响应logo.jpg的GET客户端http请求而返回max-age = 60。客户端的浏览器然后存储logo.jpg,并且在接下来的60秒内,它将从其自己的缓存中提供图像。 换句话说,在接下来的60秒内不会有针对此特定图像的HTTP请求。 因此,对于最大年龄,内容将缓存在客户端,并且不会在服务器中请求或重新验证max-age标头中指定的秒数。 然而,通常可以通过在Windows浏览器上按CTRL-F5和在Mac浏览器上按CMD-R来强制进行重新验证/刷新。在移动设备上,通常功能在浏览器菜单上,称为刷新。这是RFC的appropriate section。
<强>赞成强>
<强> CONS 强>
2)最后修改的服务器端http响应头与客户端http请求头if-modified-since一起,是加速网站和节省一些钱的另一个好机制。它基本上以这种方式工作。
浏览器首次通过GET请求向服务器请求内容。 服务器以200响应,并将内容与最后修改的标头一起返回。 最后修改的标题的值只不过是上次修改内容的实际日期和时间。 (由于时区,日期时间必须为UTC) 此时,来自客户端的相同内容的所有以下HTTP请求都将具有一个名为:if-modified-since的附加标头,其中从服务器接收的日期和时间为值。 收到以下请求时,服务器将检查if-modified-since标头值,并将其与内容的上次修改日期进行比较。 如果数据相同,因此内容没有改变,服务器将以304响应,基本上没有内容。 (最重要的部分!) 然后浏览器知道它必须保留缓存中的内容并从中加载它,因为它在服务器端没有改变。 该过程将继续,直到服务器上的内容发生更改,因此服务器将提供新的上次修改日期和新内容。 正如您所看到的,这可以节省大量带宽,尤其是在图像或JS或css的情况下,而不会放弃内容的新鲜度。 Section 14.25 of the spec比我更好地解释了事情。 :)
<强>赞成强>
<强> CONS 强>
3)ETAG是一个类似于if-modified-since的过程,区别在于标头的值通常是服务器端内容的散列,而http请求上的客户端发送一个名为的标头:如果 - 无匹配。
优缺点与第2点相同。
您现在可能想知道点2和点3之间的主要区别是什么。 第2点的问题实际上是服务器时钟。实际上,如果有时钟问题,可能会出现从服务器返回上次修改日期的问题
主题更深入,因为最佳做法是发送一个弱而强的验证器。有关详细信息,请参阅section 13.3.4。
答案 1 :(得分:1)