就需要在index.php里指定目录结构:
$smart->template_dir = "smarty/templates/";
$smart->compile_dir = "smarty/templates_c/";
$smart->config_dir = "smarty/configs/";
$smart->cache_dir = "smarty/cache/";
第一个问题解决了,紧接着就是第二个:我刚用Dreamweaver生成的漂亮模板怎么不能用?并不是模板文件有什么问题,而是因为SMARTY默认的标记分隔符是{},不巧的是Javascript肯定包含这个标记。好在我们可以用任意字符当作分隔符,再加上这两句:
$smart->left_delimiter = "{/";
$smart->right_delimiter = "/}";
这下安装就基本完成,没问题了。
四、反衬和类比
先构思一下对测试的设计。主要的评比因素当然是速度了。为了进行速度测试,采取了算术平均数的作法。在测试页面中重复将页面生成N遍,再对比总页面生成时间。另一个重要因素是易用性(至于扩展性不用比较已经有结果了),所以使用的模板不能太小。我用的是我个人主页的的页面,一个用Firework+Dreamweaver生成的HTML文件,大小约7K。其中的变量设置也采取最常用的区块,在PHPLIB template里叫block,而SMARTY则称section。别小看这称呼的不同,易用性标准分两块:模板文件和脚本文件的语法是否简明易用。
下面就深入到测试中来。先看看两种模板文件的语法:蓝条左边是PHPLIB template的模板,右边属于SMARTY。个人偏好是不一样的,所以这里不作评论。着重对比一下脚本里的处理语句,先看PHPLIB template的:
$tpl->set_file('phplib', 'bigfile.htm');
$tpl->set_block('phplib', 'row', 'rows');
for ($j = 0; $j < 10; $j++){
$tpl->set_var('tag' ,"$j");
$tpl->parse('rows', 'row', true);
}
$tpl->parse('out', 'phplib');
$tpl->p('out');
下面是SMARTY的:
$smart->assign('row',$row);
$smart->display('bigfile.htm');
SMARTY只用了tags和row两个变量,而PHPLIB template则多了模板文件的handler,还有一个莫名其妙的out。说实在的这个out我当初学的时候就不知道为什么要存在,现在看起来,还是别扭。为什么SMARTY少那么多处理语句呢?答案是工作由引擎完成了。如果你喜欢钻研源程序,可以发现在Smarty_compiler.class.php里有一个名叫_compile_tag()的函数,由它负责把section这个标签转换成php语句。这不是一个普通的标签,它带有参数和数据,节省了脚本编程的工作量,而模板标签上的工作量相差又不大,可以判定在易用性上SMARTY高出一畴。
下面该轮到我们最关注的速度了,毕竟对于一个熟练的web开发者来说,掌握再困难的工具不过是时间问题,何况模板引擎这种学习曲线平缓的技术。而速度则是web应用程序的生命,尤其是模板引擎使用在并发访问量很大的站点上,这点就更重要了。测试开始前,我觉得PHPLIB template会在这一环节上胜出,因为它经历了很多次升级,已经基本没有什么bug,而且SMARTY的引擎个头太大,不像它的对手只有两个文件。
果然,测试结果如下图,PHPLIB template有25%的速度优势: