网站运营 | 站长学院 | 技术文档 | 成语 | 歇后语 | 桌面壁纸 | 帝国时代 | 代码收藏 | IP地址查询 | 生活百科 | 生日密码 | CSS压缩 | 用户评论

优化你的smarty

【 网络 更新时间:2010-03-31 | 字体:
[导读]此文章主要针对在使用中,在不改变smarty代码的基础上,增加一些我们自己的东西,而达到一些优化而写的.主要是我在使用中遇到一些问题的解决方法,希望对大家有用~ : ) 一、 smarty默认的方式是compile_check = true;即在...

此文章主要针对在使用中,在不改变smarty代码的基础上,增加一些我们自己的东西,而达到一些优化而写的.主要是我在使用中遇到一些问题的解决方法,希望对大家有用~ : )

一、

smarty默认的方式是compile_check = true;即在每次输出模板的时候检查当前模板是否有过改变,如果有那么重新编译(判断时间戳),这会浪费一些效率,但会保证模板改动后可以正常显示,但在我们的网站上线后,很多时候,是不需要检查这个的,因为模板已经不变了~

我的建议:在开发阶段,force_compile = true;产品上线时compile_check = false;

类似下面的代码:

 

<?php
 
if (DEBUG) {
    $smarty->force_compile = true;
} else {
    $smarty->compile_check = false;
}
 
?>

二、

smarty在处理include的时候,是在主页面中做include操作,这样会有一个问题,就是当include标签越多的时候,造成页面运行慢,我的改造是合并所有的include标签,这样不必改变使用习惯,而在编译的时候smarty相当于编译了一个页面,不必执行是再include其他的小页面,当然,也许这只是试用于类似我这样,include只作为引用公共页面的功能,所以你可以自己抉择~;)

要说明的是,这样做得缺点是smarty无法检查include页面的变动,并自动重新编译,你需要自己来进行清空编译文件目录,或者是变动主模板页面来,让smarty重新编译模板~

下面是我的,做法,聪明的你一定看得懂~

 

<?php
 
$smarty->register_prefilter('smarty_fix_include');
function smarty_fix_include($out_put, &$smarty)
{
    // 找出所有的include标签,并找出file
    return preg_replace_callback('/\{include\s+.*?file=[\'"]*(.+)[\'"]*\}/i', 'smarty_fix_include_callback', $out_put);
}
 
function smarty_fix_include_callback($match)
{
    $smarty = getInstance('Smarty');
    $file = $smarty->template_dir . '/' . $match[1];
    return file_get_contents($file);
}
 
?>

三、

现在我们要做的是将所有的css提到header里面,类似的方法你可以将某些js扔到页面下面,并且压缩他们,这里我们用到了 csstidy 和 JavaScriptPacker.

代码如下:

// 前置link
if (preg_match_all('/<link.*?href=[\'"]*([^\'"]+)[\'"]*.*?\/>/’, $out_put, $regs))
{
$tidy = new csstidy();
$tidy->set_cfg(’remove_last_;’, true);
$tidy->load_template(’highest_compression’);
$result = array_unique($regs[0]);
$all = implode(”, $result);
foreach ($regs[1] as $key => $val)
{
   if (strpos($val, ‘.css’) !== false)
   {
    $dir = dirname($val);
    $name = basename($val, ‘.css’);
    $css_code = file_get_contents(ROOT_PATH . ‘/’ . $val);
    $tidy->parse($css_code);
    if (file_put_contents(ROOT_PATH . ‘/’ . $dir . ‘/’ . $name . ‘_tidy.css’, $tidy->print->plain()))
    {
     $all = str_replace($val, $dir . ‘/’ . $name . ‘_tidy.css’, $all);
    }
   }
}
if (strrpos($out_put, ‘‘) !== false)
{
   $out_put = str_replace($result, ”, $out_put);
   $out_put = strtr($out_put, array(’‘ => $all . “\n“));
}
}
// 压缩js
if (preg_match_all(‘%<script.*?src=[\'"]*(?!http:)([^\'"]+)[\'"]*.*?></script>%’,$out_put, $regs))
// 这里做了一些处理,只匹配非http开头的script标签
{
foreach ($regs as $key => $val)
{
   $regs[$key] = array_unique($val);
}
foreach ($regs[0] as $key => $val)
{
   $dir = dirname($regs[1][$key]);
   $name = basename($regs[1][$key], ‘.js’);
   $js_code = file_get_contents(ROOT_PATH . ‘/’ . $regs[1][$key]);
   $pack = new JavaScriptPacker($js_code);
   if (file_put_contents(ROOT_PATH . ‘/’ . $dir . ‘/’ . $name . ‘.pack.js’, $pack->pack()))
   {
    $out_put = str_replace($regs[1][$key], $dir . ‘/’ . $name . ‘.pack.js’, $out_put);
   }
}
}

四、

在smarty编译模板前,我们可以用下面的方式去掉页面的注释,并对html进行压缩,以减少页面输出体积。

类似下面的代码:

$smarty->register_prefilter('smarty_prefilter');
function smarty_prefilter($out_put, &$smarty)
{
    //?;marty标签将<-- {xxx} -->替换成 {xxx}
    $out_put = preg_replace('/<!--[^>|\n]*?({.+?})[^<|{|\n]*?–>/’, ‘\1′, $out_put);
    // 去掉html注释
    $out_put = preg_replace(’/<!–.*?–>/’, ”, $out_put);
    // 压缩html代码,去掉行首尾空格及换行
    return preg_replace(”/\s*[\n\r]+\s*/”, ”,$out_put);
}

五、总结

经过前面讲到的处理方法,可以总结针对smarty优化的方法,整理一些,方便大家理清思路,做相应的处理,如果有疑问,请回看之前的文章~

注意:我提到的优化方式,主要是针对smarty编译模板前,对模板进行处理,即用到smarty的register_prefilter函数,来达到预处理的目的,这样做的好处是处理只在编译模板时进行.

1. 在开发阶段结束后,网站上线后,关掉compile_check,即设置:compile_check = false;

2. 处理include标签,将多个小页面合并成完整的页面在进入编译.

3. 将css文件提前,可能的话将js文件放到页面下面,并压缩他们,(如果可以,你还可以合并他们)

4. 去掉页面注释,并压缩html代码.gzip(deflate甚至是:bzip2)输出页面,当然这也适合css,js文件的输出.注意是判断浏览器是否支持他们.

经过这一番改造,相信你的页面输出会更快~

友荐云推荐
  • 转载请注明来源:网站运营 网址:http://www.chinawobo.com/ 向您的朋友推荐此文章
  • 特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系我们,我们会尽快予以更正。
RSS订阅
  • QQ邮箱
  • 填写您的邮件地址,订阅我们的精彩内容:
更多
© 2014 网站运营 - T086.com(原itlearner.com)
微商货源 | 冠珠陶瓷 | 迪威乐云商devmsn | 易奇八字 | wwe美国职业摔角 | 八字算命 | 河南旅游景点大全 |
RunTime:6.78ms QueryTime:7