2011-08-24 29 views
2

我需要为用户生成并提供一个相对较大的JSON文件。我的意思是400KB。这是两张表的连接,随着时间的推移它可能会变得更大。我打算用它来填补HTML表格中的空白,通过数据库中的ID连接项目。服务器端和客户端缓存一个相对较大的JSON文件

为了节省带宽,我只希望客户端每天下载一次这个JSON文件。 (简单的选择似乎是“每次”和“从不”...... grr。)实际上,它会更少地更新服务器端,但我不希望它不那么频繁。 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。我觉得我读到这可能会有所作为。

回答

3

发送正确的缓存标头只需要一半的步骤。您仍然需要send304状态,表示自上次客户端获取内容以来没有任何更改。这可能会变得棘手。我建议使用.htaccess来代替执行此缓存。更可以发现here

ExpiresActive On 
ExpiresDefault "access plus 1 day" 

Edit--

如果你不得不做这一切在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; 
} 
+0

我在前面发现了标题示例页面,但我想我没有充分利用它。你可能错过了它(我会让它更明显),但我没有使用Apache,所以mod_expires将无济于事。 – Guttsy

+0

签出我的更新。你需要手动完成。 –

0

为了节省bsndwith,你也可以用compresion在传输。调用ob_start('ob_gzhandler');启动php文件,但要确保你的内容类型设置为text/plain或text/html,因为ie7不认为gzip应用程序/ json内容存在

1

你有没有想过使用浏览器本地存储?您使用javascript来检查数据是否存储在本地。如果它不是,或者是旧的,那么你从服务器获取并将其存储在本地。几乎所有“现代”浏览器都支持本地存储,即IE8,Firefox 3.5,Safari 4,Chrome及更高版本。对不起,但IE7不支持它。

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

+0

鉴于有一半人使用IE7(不幸),这可能是一个问题。尽管如此,关闭这些增强功能会让他们考虑升级。我喜欢这个想法......只需要弄清楚如何实现它。 – Guttsy

相关问题