smarty缓存终极优化测试

之前在看到可以关闭compile_check来减少模板编译文件的判断,这几天看了下 郭欣 的《构建高性能Web站点》,再次学到好东西。就是放弃smarty自带的缓存文件的判断,直接生成html文件,然后用stat来检查html文件的时间,用来判断是否缓存是否过期。代码类似:

    $cache_filename = 'cache/enjoy_'.$par.'.htm';
    $stat_info = @stat($cache_filename);
    if($stat_info && $stat_info[9] > time()-10800){
        echo file_get_contents($cache_filename);
        exit();
    }
    ......
    $html = $smarty->fetch($template_name,$par);
    file_put_contents($cache_filename,$html);
    echo $html;


用本机的程序测试了下,本机因为是测试环境,没有装apc。

ab.exe -n 100 -c 10  http://www.itokit.com/

没用使用smarty缓存,就1句速度很快的SQL查询语句
Document Path:          /
Document Length:        16787 bytes

Time taken for tests:   1.984 seconds
Total transferred:      1697100 bytes
HTML transferred:       1678700 bytes
Requests per second:    50.39 [#/sec] (mean)
Time per request:       198.438 [ms] (mean)
Time per request:       19.844 [ms] (mean, across all concurrent requests)
Transfer rate:          835.19 [Kbytes/sec] received

使用smarty缓存后:
Time taken for tests:   1.891 seconds
Total transferred:      1697100 bytes
HTML transferred:       1678700 bytes
Requests per second:    52.89 [#/sec] (mean)
Time per request:       189.063 [ms] (mean)
Time per request:       18.906 [ms] (mean, across all
Transfer rate:          876.60 [Kbytes/sec] received
没多大提高。

改造之后,但仍然先构造了smarty对象
Time taken for tests:   0.688 seconds
Total transferred:      1697100 bytes
HTML transferred:       1678700 bytes
Requests per second:    145.45 [#/sec] (mean)
Time per request:       68.750 [ms] (mean)
Time per request:       6.875 [ms] (mean, across all concurrent requests)
Transfer rate:          2410.65 [Kbytes/sec] received

显著提高啊!
把加载smarty的语句放在判断后:

Time taken for tests:   0.391 seconds
Total transferred:      1697100 bytes
HTML transferred:       1678700 bytes
Requests per second:    256.00 [#/sec] (mean)
Time per request:       39.063 [ms] (mean)
Time per request:       3.906 [ms] (mean, across all concurrent requests)
Transfer rate:          4242.75 [Kbytes/sec] received
再次大幅提高!


如果自定义了缓存文件名称,那么删除缓存文件就得另外写一个,不能使用smarty自带的。如果要使用smarty自带的删除功能,那么缓存文件就要使用smarty的方式来命名。如模板文件为index.html,那么生成的缓存文件为:%%77^774^774BE9C9%%index.html,如果加了hx这个$cache_id,那么缓存文件为:hx^%%77^774^774BE9C9%%index.html。这是怎么生成的呢?我根据smarty核心程序中的_get_auto_id和_get_auto_filename函数写了一个生成缓存文件名的一个函数。
function get_smarty_cachefile($cache_dir,$template_name,$cache_id=null){
    $_compile_dir_sep = '^';
    $_return = $cache_dir.DIRECTORY_SEPARATOR;
    if(isset($cache_id)) {
        $auto_id = str_replace('%7C',$_compile_dir_sep,(urlencode($cache_id)));
        $_return .= $auto_id . $_compile_dir_sep;
    }  
    
    $_filename = urlencode(basename($template_name));
    $_crc32 = sprintf('%08X', crc32($template_name));
    $_crc32 = substr($_crc32, 0, 2) . $_compile_dir_sep .
              substr($_crc32, 0, 3) . $_compile_dir_sep . $_crc32;
    $_return .= '%%' . $_crc32 . '%%' . $_filename;
    return $_return;
}
这个函数,未考虑缓存目录分级,如果有使用缓存目录分级$smarty->use_sub_dirs=true,那么只需要把$_compile_dir_sep = '^';改为$_compile_dir_sep =DIRECTORY_SEPARATOR即可。
如上例:            
$cache_filename = get_smarty_cachefile('cache',$template_name,'hx');
这样就可以使用$smarty->clear_cache($template_name, 'hx')来删除这个缓存文件。

这样,只需要更改判断是否有缓存的代码,尽量把加载smarty的代码和初始化smarty放到判断之后,其他的不用考虑,就可以享受smarty性能的提升了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值