动态?伪静态?还是静态
由于项目需要,明晨网络Mingchennet.com对LAMP下的动态、伪静态和静态页面做了分析比较,最终决定采用 “定时过期的缓存机制”来实现静态化。在这种方案中,绝大部分页面是静态,少部分是伪静态,极少部分是动态。
为什么要静态化?1、SEO友好!2、减小服务器开销。
哪些页面应该伪静态?tag页面。由于信息每天都在频繁更新,将tag页面全部静态化,开销不小,动态的话,则URL对搜索引擎不够友好,所以将tag.php?kw=php&page=1伪静态成为了tag/php/1.html。
哪些页面应该保持动态?搜索页面。比如s.php?kw=php。这种搜索页面没有必须静态化。
好了,现在该谈静态化了。
刚开始,明晨网络在项目中,是采用缓存来降低服务器压力的。页面第一次被请求时,先从数据库中读取信息,序列化后保存在文件缓存中,以后该页面再被请求,直接从缓存读取并输出到模板,基本做到毫秒级响应,与静态页面差不多了。但是后来通过抓包分析发现,虽然通过URL路由设置(详见《ThinkPHP的Router路由使用体会》http://www.mingchennet.com/plus/view.php?aid=55),可以表现出与静态页面一样的URL,但是并不能真正模拟静态页面。
在哪里与静态页面不同?http header。请求Apache下的静态文件,Response Head中会包含文件的最后修改时间和ETAG,这好说,我们通过PHP脚本同样可以返回这两个head信息。但是,如果客户端第二次请求这个文件,会增加两个HEAD信息If-None-Match和If-Modified-Since,Apache根据这些判断是返回请求的文件信息,还是返回304告诉客户端文件没有更新直接用缓存中的就行了。是的,就是这个304,省去了服务器的CPU、内存和内存开销。并且这几个head应该也是被搜索引擎的蜘蛛广泛使用的。
那这些信息PHP可以动态处理么?LMAP默认是不可以获取head中的If-None-Match和If-Modified-Since信息,通过配置htaccess可以才得到$_Server['HTTP_IF_NONE_MATCH'],规则如下
RewriteRule .* - [E=HTTP_IF_NONE_MATCH:%{HTTP:If-None-Match}]
RewriteRule .* - [E=HTTP_IF_MODIFIED_SINCE:%{HTTP:If-Modified-Since}]
这样可以根据客户请求返回304状态,完美伪装成静态页面,流量是节省下来了,不过还是要牺牲一部分CPU和内存。当然如果有个WEB前端代理服务器,可以将这个页面cache下来,则牺牲这点CPU和内存是值得的。如果没有代理服务器,则最好还是静态化吧,不然访问量一大,服务器性能几何级下降。
明晨网络在项目中实现静态化,是按访问生成的。比如,客户端访问http://www.a.com/news_123.html,而此时,id为123的新闻系统还没有生成静态页面,所以请求被根据htaccess的规则转交到php文件上,php判断当前url,生成这个静态页。这里给出几个表格概括的对比下静态、伪静态、动态页面的区别。优化的动态/伪静态页主要指使用文件缓存和智能发送304状态。注:数据主要为显示区别,未经严格测试。
| 访问次数 | 静态页面 | 按需生成静态页 | 优化的动态/伪静态页 | 未优化的动态/伪静态页 |
| 第一次请求,http状态码 | 200 | 200 | 200 | 200 |
| 第二次请求,http状态码 | 304 | 200 | 304 | 200 |
| 第三次请求,http状态码 | 304 | 304 | 304 | 200 |
| 访问次数 | 静态页面 | 按需生成静态页 | 优化后的动态/伪静态页 | 未优化的动态/伪静态页 |
| 第一次请求,CPU占用 | 1 | 10 | 10 | 20 |
| 第二次请求,CPU占用 | 1 | 1 | 10 | 20 |
| 第三次请求,CPU占用 | 1 | 1 | 10 | 20 |
| 访问次数 | 静态页面 | 按需生成静态页 | 优化后的动态/伪静态页 | 未优化的动态/伪静态页 |
| 第一次请求,带宽占用 | 1915 | 1915 | 1915 | 1915 |
| 第二次请求,带宽占用 | 1 | 1915 | 1 | 1915 |
| 第三次请求,带宽占用 | 1 | 1 | 1 | 1915 |
文章源自:明晨网络,admin,《动态?伪静态?还是静态》,http://www.mingchennet.com/tec/code/php/56.htm
- 上一篇:ThinkPHP的Router路由使用体会
- 下一篇:没有了