宇宙通用版页面完全静态化插件 v1.0
By Sodoit QQ 36556161 Release 2011.3.5
一、 开发过程和原因
这两天在研究 ecshop 速度,在使用 linux 的 ab 命令对服务器进行压力测试后发现,虽然
ecshop 适用了页面缓存,数据缓存等一系列方法来进行加速,但是服务器的吞吐率(这里
定义为服务器每秒能承受的最大访问次数 requests per second,测试条件 200 请求数,并发
100)却只有 30 左右。在 init.php 文件的最后一行加上 die;重新测试,系统吞吐率并没有上
升多少,可见,制约程序速度的瓶颈并不在页面的处理上,于是继续在 init.php 文件的前面
行后面加上 die,继续测试。最后,发现制约 ecshop 速度的瓶颈在那一堆类,函数的加载
上面,如果把 die 放到
require(ROOT_PATH . 'includes/inc_constant.php');
require(ROOT_PATH . 'includes/cls_ecshop.php');
require(ROOT_PATH . 'includes/cls_error.php');
require(ROOT_PATH . 'includes/lib_time.php');
require(ROOT_PATH . 'includes/lib_base.php');
require(ROOT_PATH . 'includes/lib_common.php');
require(ROOT_PATH . 'includes/lib_main.php');
require(ROOT_PATH . 'includes/lib_insert.php');
require(ROOT_PATH . 'includes/lib_goods.php');
require(ROOT_PATH . 'includes/lib_article.php');
后面,吞吐率只有 59.8,但是把 die;放到这些前面,系统吞吐率马上上升到 485.4,提升了
8 倍还多。
于是,我设想是因为加载的文件数比较多,磁盘的 IO 速度制约了系统速度,于是我把这些
文件合并成一个文件,并且去除所有注释和换行,但是吞吐率提升并不大,于是又尝试把
这些文件缓存到 memcache 里,仍旧不行,于是确定了是这些类和函数的加载和初始化影
响了系统吞吐率,但是这些类和函数对 ecshop 是不可缺少的,不能不加载,通过优化这些
类和函数的方法对提升系统吞吐率帮助又不大。于是考虑页面静态化,这样就可以避开这
些类和函数了。
二、功能设想和设计目标
1,实现一个宇宙通用的插件,不局限于 ecshop,适用于所有程序
2,插件化、整合化、使用简单,尽量不用改动原有程序就可使用
3,程序高度优化,生成静态文件自动、高效、快速
4,适用性强,不管服务器是否开启了 url 重写模块都能适用,并且大幅提升系统吞吐率
二、 插件组成
插件由三个文件组成,cls_page_cache.php 是静态化页面生成和处理类,公共方法只有
write_cache 和 get_cache,这个类在模式 2 运行的时候能够自动生成静态页面,对过期页面,
能够自动重新生成(具体的模式后面将详细介绍)
lib_page_cache.php 里面只有一个 cache 函数,这个函数能够自动截取页面输出的控制权,
如果静态页面文件不存在,那么生成静态页面文件,反之,直接输出页面
page_cache_config.php 是插件的配置文件