PHP动态页面如何实现浏览器缓存?

赵开锦 发布于 2013/07/23 17:33
阅读 3K+
收藏 4
PHP

我们公司的网站主要频道都是使用PHP直接查询solr显示的,但是最近业务量越来越大,服务器压力也很大,于是就动了充分使用浏览器缓存的思路,具体情况如下

我们网站的ResponseHeaders:
HTTP/1.1 302 Moved Temporarily
Server: nginx/1.2.3 Date: Tue, 23 Jul 2013 09:07:13 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
因为是动态页面的,所以始终不能使用浏览器缓存,即Pragma: no-cache 

然后我研究了一下58的租房频道发现他们的显示效果也是动态的,但是他们确成功实行了浏览器缓存,他第一次访问时,ResponseHeaders如下:
HTTP/1.1 200 OK
Date: Tue, 23 Jul 2013 09:20:04 GMT
Server: Apache-Coyote/1.1
Last-Modified: Tue, 23 Jul 2013 09:19:56 GMT
Cache-Control: max-age=40
Content-Type: text/html;charset=UTF-8
Content-Encoding: gzip
Vary: Accept-Encoding
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Transfer-Encoding: chunked
然后你按F5刷新,如果没有新房源增加,其ResponseHeaders就如下:
HTTP/1.1 304 Not Modified
Date: Tue, 23 Jul 2013 09:30:02 GMT
Server: Apache-Coyote/1.1
Connection: Keep-Alive
Keep-Alive: timeout=15, max=99
明显可以看出
他们成功使用了浏览器的缓存。

但是这个具体是怎么实现的呢?请高手们解惑,最好给出PHP的代码范例,谢谢。

加载中
0
斯诺登
斯诺登
估计默认开启了session,这样的话,session.cache_limiter的默认值就是nocache,就会输出Pragma:no-cache,为了保持session_start又要页面可以缓存,在session_start之前,设置session_cache_limiter('public')
赵开锦
赵开锦
嗯,主要是现在访问量增长太快,而老板短期内又不给加机器,没办法只能这样。
斯诺登
斯诺登
@赵开锦 不过要谨慎使用浏览器端缓存,数据更新快的地方不建议使用
赵开锦
赵开锦
经查确实是这方面原因,谢谢。
0
Tuesday
Tuesday
header("Pragma: public"); // required
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false); // required for certain browsers
header("Expires: " . gmdate("D, d M Y H:i:s", time() + 365*24*60*60) . " GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
0
赵开锦
赵开锦

header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");

这样是不是缓存只有1秒?

赵开锦
赵开锦
回复 @胖胖 : 因为是PHP动态页啊,而且根据产品规则,页面有一块是随机显示的,这样的话只要到服务器,永远都是新的,永远都是被修改过的
胖胖
胖胖
这句是告诉浏览器网页最后的更新时间 第一次请求会缓存 第二次请求的时候 根据 HTTP 协议的规定,浏览器会向服务器传送 If-Modified-Since 报头,询问该时间之后文件是否有被修改过
0
赵开锦
赵开锦
没有人研究过这个问题吗?
0
赵开锦
赵开锦
急,自己顶。
0
Tuesday
Tuesday
自己不去实践, 谁会帮你. 1楼的代码, 认真看清楚.
0
猪猪
猪猪

好好看下http 304协议,php主要是通过header输出响应协议头信息

拿来主义要不得

0
孙彦欣
孙彦欣
怎么不在自己服务器加缓存。。
0
斯诺登
斯诺登
优化的方向错了,应该往数据缓存方向优化,加层kv库,避免直接查关系数据库
斯诺登
斯诺登
回复 @赵开锦 : 不是所有数据都缓存,缓存热点数据,当然会有一些数据匹配不到,然后直接读库的情况,要做的是提高一下命中率,以前看过资料,facebook这类巨型网站缓存命中率也只做到95%左右,这已经是很高的了。
赵开锦
赵开锦
你的意思是,我页面每次显示50条数据,我一次从solr取100页,然后缓存起来,有效期在2到5分钟,之后客户在这个时间段来的话,就取缓存来显示,不走solr吗,不过这样的话,一页的动态数据大概在1K左右,100页就要100K,这个redis键值会不会太大,影响性能啊?
赵开锦
赵开锦
数据缓存这个方面已经做过了
0
水平凡
水平凡
标记一下!
返回顶部
顶部