优化你的smarty

[导读]此文章主要针对在使用中,在不改变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)
{
    //保护smarty标签将<-- {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文件的输出.注意是判断浏览器是否支持他们.

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

posted @ 2012-08-15 14:24  phpbin  阅读(271)  评论(0编辑  收藏  举报