服务器端和客户端缓存相对较大的JSON文件


Server- and client-side caching of a relatively large JSON file

我需要生成并向用户交付一个相对较大的JSON文件。总的来说,我指的是400kb。它是两个表的连接,随着时间的推移,它可能会变得更大。我打算用它来填补空白在一个HTML表,链接项目通过id从数据库。

为了节省带宽,我只希望客户端每天下载这个JSON文件一次。(最简单的选择似乎是"每次"answers"从不"……嗯……)。实际上,它在服务器端的更新频率较低,但我不希望它的更新频率较低。如果有区别的话,90%的浏览器都是IE7/8。

对于服务器端缓存,我目前只是将JSON文件放入服务器上的文本文件,如果它超过几个小时。我知道我可以用memcached代替。 memcached是否比文件有更大的优势?(单服务器,每天1k访问者,我还没有安装memcached)

根据PHP手册的注释,我试了这个:

$expires = 60*60*24;
header("Pragma: public");
header("Cache-Control: maxage=".$expires);
header('Expires: ' . gmdate('D, d M Y H:i:s', time()+$expires) . ' GMT');

但它似乎什么也不做。Chrome是告诉我,它是"OK"每次我加载生成页面直接,没有关于缓存控制的标题显示在网络/标题选项卡下。我没有明确地点击刷新。看起来一点都不像缓存。是否有其他方法可以节省客户端的时间和带宽?我最好的想法是创造性地修补.ajax()缓存选项。

我实际上还没有实现Ajax调用。婴儿的步骤。

对不起,我有点啰嗦。对我大喊大叫,我会在需要的时候尽我所能地改进问题。我在这里和谷歌上做了一些搜索,还没有遇到任何非常有用的东西。也许我没有正确的关键术语

注意:我在IIS 7下运行PHP,所以它是CGI。

发送正确的缓存标头只是所需步骤的一半。您仍然需要发送304状态,说明自上次客户端获得内容以来没有任何变化。这可能会很棘手。我建议使用.htaccess来做这个缓存。更多信息请点击

例子
ExpiresActive On
ExpiresDefault "access plus 1 day"

编辑——

如果你必须在php中完成这一切,那么你必须手动检查请求头并发送304。你可以这样做:

$last_modified_time = filemtime($file); 
$etag = md5_file($file); 
header("Last-Modified: ".gmdate("D, d M Y H:i:s", $last_modified_time)." GMT"); 
header("Etag: $etag"); 
if (@strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) == $last_modified_time || 
    trim($_SERVER['HTTP_IF_NONE_MATCH']) == $etag) { 
    header("HTTP/1.1 304 Not Modified"); 
    exit; 
}

您考虑过使用浏览器本地存储吗?使用javascript检查数据是否存储在本地。如果不是,或者是旧的,那么从服务器获取它并将其存储在本地。几乎所有"现代"浏览器都支持本地存储,即IE8、Firefox 3.5、Safari 4、Chrome及以上版本。对不起,IE7不支持。

memcache最大的优点是它是一个分布式存储系统。所以你可以有4个负载均衡的web服务器访问相同的数据存储。这是基于内存的意味着更好的性能,但它似乎不像你会有性能问题。

要保存bsndwith,还可以在传输时使用压缩。启动调用ob_start('ob_gzhandler');的php文件,但要确保您的内容类型设置为text/plain或text/html,因为ie7不认为gzipped应用程序/json内容存在