喜悦国际村 
» 游客:  注册 | 登录 | 搜索 | 统计 | 喜悦证交所 | 帮助

RSS 订阅当前论坛  

[北京]代朋友公司招聘PHP高级程序员多名

上一主题 下一主题
 20  1/2  1  2  > 
     
标题: [原创] 从smarty复杂的语法中解放出来!!执行速度最快也要比smarty快20倍(100多行代码)  
 
robinhunan
注册会员
Rank: 2
一般会员



UID 20392
精华 0
积分 180
帖子 150
金钱 180 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2003-6-3
状态 离线
从smarty复杂的语法中解放出来!!执行速度最快也要比smarty快20倍(100多行代码)



mctemplate (mini Compiled templdate)简介
mctemplate是一个支持大型WEB应用程序的模板引擎.
mctemplate有什么特色? 
普通模板引擎工作方式: 你的PHP脚本指定一个HTML模板,指定动态内容并显示。模板分析器使用指派的内容替换模板内所有的占位符,然后显示给用户. 这意味着,每次你要输出一些内容,程序都要花上好多时间去进行字符串的处理和正则表达式的工作。
template 的工作方式类似模板编译,他把模板转换为可执行的PHP脚本,并且保存起来以备以后重用。当一个新的模板在第一次被使用时,The first time a new template is processed, 模板内所有的占位符被替换为简单的可输出指定内容的PHP代码元素。据个例子,模板片断 <H3>{$title}</H3>,将被转换为 <H3><?php echo $title?></H3>. 如果你指定内容给正确的变量, 将再也不需要进行模板分析了. 程序要做得仅仅是自己包含并执行便以后的模板. 这通常会戏剧性的减少模板引擎的运行时间.

mctemplate 支持:


" 普通变量替换 (字符串,等等)
" 重复的内容块 (嵌套数组/ BEGIN..END)
" 基本的逻辑控制结构 (IF..ELSEIF..ELSE)
" 可定制的扩展模块 (输出过滤, 大小写转换, 格式输出, 等等.)
" 模板编译 (HTML 模板被转换为可执行的PHP代码)
" 输出缓存 (重用输出页面从而提速你的程序)
" 生成静态文件
" 模板文件中、直接包含php代码,因此可以直接执行php函数
" 宏定义 






让我们用一些简单的例子开始,告诉你如何使用 template:

通常的流程是先建立一个WEB页面,展示所需要的效果. 创建简单的页面版式可以使用一个网页编辑器,例如Dreamweaver或者Homesite. 为了获得更为友好的页面版式效果,可以使用一个专业的设计工具,例如Photoshop、 Paintshop Pro或者Gimp等等.

预览:

Hello World!

现在我们来看看达到我们期望的页面版式的HTML源代码:

HTML-源代码 (hello_world.html):

<HTML>
<H3>Hello World!</H3>
</HTML>

然后开始令人激动的一步: 分离内容和设计. 我们把HTML源代码之中的内容元素替换为模板占位符. 模板占位符被分配一个唯一的名称并且使用一个特有的标签包含起来,这样我们在随后的程序之中可以识别他们. 标题 Hello World! 被替换为一个叫做TITLE 的占位符. 我们是用大括弧来标记占位符, 似的我们的模板引擎可以发现: {TITLE}. 最后HTML模板如下:

HTML-模板 (hello_world.tpl.html):

<HTML>
<H3>{$title}</H3>
</HTML>

使内容整合到模板,我们需要做如下工作:
" 调用 template 类 
" 创建一个 template 分析器 对象 
" 告诉 template 要使用的HTML模板 
" 指定内容给关联的占位符 
" 处理模板 
" 输出结果 




以下的PHP程序完成所需的工作:
hello_world.php:

<?php

require_once "template.class.php";
$page = new template("hello_world.tpl.html");
$title ='Hello World!';
include 
$page->compiledFile();

?>

就这么简单 – 我们的 Hello World 例程已经准备运行了. 

比Smarty要快上20倍!
mctemplate 直接支持php, php有多少函数就支持多少函数啦 支持多种功能和函数, 但是在你的程序运行期间,仅仅很少一部分时间用在模板处理上.
从从复杂的smarty学习中解放出来。 经测试一个hello 程序,mctemplate比smarty快4倍

文件包含程序比smarty 快20倍!! 







template 配置


string $template_dir
模板文件目录,默认为 ./templdates/ 
可使用全局变量$_CONFIG['template_dir']设置

string $temp_dir
模板编译保存目录,默认为./templates_c/
注意:确保PHP对该目录可写

string $cache_dir
输出缓存目录,默认为./cache/
注意:确保PHP对该目录可写

int $cache_lifetime
默认输出缓存周期


基本方法
常量表示
{name}被解析成<?=name?>,表示显示常量name的值,其中的“name”由英文字母、数字和下划线组成首字母必须是英文字母或者下划线。

例子1:标量赋值

<?php

$template
=new template('template.html');

define('TITLE,'Sample Text');;

include $template->compiledFile();

?>

模板(template.html):

<html> {TITLE} </html>

输出:

<html> Sample Text </html>

例子2: 多个标量赋值

<?php

$template=new template('
user.html');

$name='
John Doe' ;
$group='
Admin';
$age = '
42' ;

include $template->compiledFile();

?>

模板(user.html):

Name: {$name}
Group: {$group}
Age:{$age}

输出:

Name:John Doe
Group: Admin
Age:42

例子3: 使用数组给多个标量赋值

<?php

$user=array(
'
NAME'=> 'John Doe', 
'
GROUP' => 'Admin',
'
AGE'=> '42',
);

$template=new template('
user.html');


include $template->compiledFile();

?>

模板(user.html):

Name:{$user['
NAME']}
Group: {$user['
GROUP']}
Age:{$user['
AGE']}

输出:

Name:John Doe
Group: Admin
Age:42

例子4: 列表赋值(links.php)

<?php

$links=array(
array(
'
TITLE' => 'PHP',
'
URL'=> 'http://www.php.net/',
),
array(
'TITLE' => 'Apache',
'URL'=> 'http://www.php.net/',
),
array(
'TITLE' => 'MySQL',
'URL'=> 'http://www.mysql.com/',
),
);

$template=new template('links.html');

include 
$template->compiledFile();

?>

模板(links.html): 结构名称lnks对应数组

<html>
<h3> Sample Links </h3>

<!-- $links AS $v --> 

<a href="{$v['URL']}"> {$v['TITLE']} </a><br />

<!-- end -->
</html>



输出:

<html>
<h3> Sample Links </h3>

<a href="http://www.php.net/"> PHP </a>

<a href="http://www.apache.org/"> Apache </a>

<a href="http://www.mysql.com/"> MySQL </a>

</html>


例子5: 用缓存 (2_use_cache.php)

template::useCache
void useCache ( [cache file] )
激活内建的输出缓存. 判断当前执行的脚本 (判断依据$_SERVER[REQUEST URI]) 是否在确定的时间内执行过. 如果执行过, useCache 将返回缓存的页面给浏览器并且中止运行.
如果没有一个有效的输出句柄可以使用,useCache将激活PHP输出缓存,并且返回数据到执行它的脚本. 下面的脚本执行时, useCache 捕获所有输出到浏览器的内容,并保存到缓存目录. 缓存的每一个文件名称是唯一的,他根据当前执行的脚本文件名称,GET参数(REQUEST_URI)以及可选得参数来自东设定.
如果脚本有一些重要的工作,例如记录日志等,那么应该在use_cache 之前调用你的代码.
例子:

<?php

require 'template.class.php';

$t = new template('hello_world.tpl.html');
$t->useCache(); //active output cache 


$title 'Hello yubing! '.date('Y-m-d H:i:s');

include 
$t->compiledFile();

?>


例子6: 生成静态页面 (gen_htm.php)

template::useCache
void useCache ( [html file name] )
为了获得更快效率,有时候我们需要将页面生成静态页面,直接访问静态页面速度会快很多!一下实例在页面生成了一个index.html的文件。
例子:

<?php

require 'template.class.php';

$t = new template('hello_world.tpl.html');
$t->useCache('htm/index.html');


$title 'This script show how to generate a html file! '.date('Y-m-d H:i:s');

include 
$t->compiledFile();

?>






例子7、条件判断
{if *} * {else} * {elseif} * {/if} 或者 {if *} * {/if},其中{if *}中的*就是此判断语句的条件表达式,符合php的表达式。


语法如下:
变量不为空

<!-- if($username)--> name not empty <!-- end -->

变量值判断

<!-- if($picture)--> Your name is jack! <!-- end -->

(var 在 ENDIF 之后是可选的,但是最好加上)

<?php

require_once "template.class.php";
$page = new template("if.html");

$username'jack' ;
$usergroup='ADMIN';
$picture'' ;

include 
$page->compiledFile();

?> 

if.php使用的模板文件如下:

<!-- if($username)--> <H3> Welcome, {$username} </H3><!-- end -->


<!-- if($picture)--> <img src="{$picture}"> <!-- end -->


<!-- if($usergroup=="ADMIN") -->

<a href="admin.php"> ADMIN Login </a><br>
<!-- end -->



if.php执行的效果如下:
输出: (查看)

<H3> Welcome, jack </H3> 




<a href="admin.php"> ADMIN Login </a><br>

例子7、包含子模版
{include 文件名 } 

if.php使用的模板文件如下:
include.html:

{include file="header.html"}
{$body}
{include file="footer.html"}

include.php执行的效果如下



<h1>Hello World!</h1>
body<hr />
<h2>copy right</h2>

例子8、直接包含php代码
{include 文件名 } 

php.php使用的模板文件如下:
php.html:

<h1>

<?php 
echo strtoupper($title);
?>
</h1> 



php.php执行的效果如下



<?php require_once "template.class.php";
$page = new Template("php.html");
$title ='Hello World!';
include 
$page->compiledFile();

?>



例子9、美工也可以看到的图片
{include 文件名 } 

8_image.php使用的模板文件如下:
image.html:

<h1>

<img src="{$images}/beijing.jpg" /> 
</h1> 



8_image.php执行的效果如下



<?php 
require_once "template.class.php";
$page = new Template("image.html");
$images ='templates/{$images}/';
include 
$page->compiledFile();

?>



例子10 为多语言而生

8_image.php使用的模板文件如下:
image.html:

<h1>{%title}</h1>



8_image.php执行的效果如下



<?php

require_once "template.class.php";
$page = new Template("lang.html");

$lang['title'] ='模版显示中文';
include 
$page->compiledFile();

?> 





例子11、McTemplate VS smarty 


8_image.php使用的模板文件如下:
hello.html:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">
</HEAD>

<BODY>
{$title}
</BODY>
</HTML>



mctemplate 代码 



<?php
require_once "template.class.php";
$page = new Template("hello.html");

$title 'Hello World!';
include 
$page->compiledFile();

?>





smarty 代码 



<?php

include_once("Smarty.class.php");
class 
SmartyTpl extends Smarty{
function 
SmartyTpl(){
$this->Smarty();
$this->template_dir "./templates/";
$this->compile_dir '/tmp';

$this->compile_check true;
$this->cache_lifetime=0;

}

}
$title 'Hello World!';
$smarty->assign('title',$title);
$smarty->display('hello.html');

?>







8_image.php使用的模板文件如下:
include.html:

{include file="header.html"}
{$body}
{includE file="footer.html"}



mctemplate 代码 



<?php
require_once "template.class.php";
$page = new Template("include.html");


$title 'Hello World!';
$body 'body';
$footer ='copy right';
include 
$page->compiledFile();

?>





smarty 代码 



<?php

include_once("Smarty.class.php");
class 
SmartyTpl extends Smarty{
function 
SmartyTpl(){
$this->Smarty();
$this->template_dir "./templates/";
$this->compile_dir '/tmp';

$this->compile_check true;
$this->cache_lifetime=0;

}

}
$title 'Hello World!';
$body 'body';
$footer ='copy right';

$smarty = new SmartyTpl();
$smarty->assign('body',$body);
$smarty->assign('title',$title);
$smarty->assign('footer',$footer);
$smarty->display('include.html');

?>
[ 本帖最后由 robinhunan 于 2007-8-22 06:27 PM 编辑 ]


 附件: 您所在的用户组无法下载或查看附件
2007-8-22 06:25 PM#1
查看资料  发短消息  QQ  顶部
 
make3782
乞丐




UID 83246
精华 0
积分 -6
帖子 7
金钱 -6 喜悦币
威望 0
人脉 0
阅读权限 1
注册 2006-11-16
状态 离线
[推荐阅读] 一个MYsql问题哦 伤了我一天的脑筋了
循环怎么处理呢?
2007-8-24 12:41 PM#2
查看资料  发短消息  顶部
 
scf2
注册会员
Rank: 2
中级会员



UID 19294
精华 0
积分 195
帖子 210
金钱 195 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2003-4-1
来自 重庆人在深圳
状态 离线
[推荐阅读] 我需要半年内赚100万!
section类似的功能呢? 只有foreach吗?



傲客网,找你想要的......
http://oklrc.com
2007-8-24 10:45 PM#3
查看资料  访问主页  发短消息  QQ  顶部
 
robinhunan
注册会员
Rank: 2
一般会员



UID 20392
精华 0
积分 180
帖子 150
金钱 180 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2003-6-3
状态 离线
[推荐阅读] 北京[上地]招聘PHP工程师1-2年经验
代码的例子里面有类似smarty的section

如果你要搞更复杂的section就用php,php实现的比smarty的要简单。
普通换行<br>
<table border="1" width="100%"  bordercolor="#808080" style="border-collapse: collapse">
        <tr>
        <!-- $lists AS $k=>$v -->
                <td>{$v}</td>
                <!-- Row:2 -->
        <!-- END -->
        </tr>
</table>
<br>
换行改变颜色<br>
<table border="1" width="100%"  bordercolor="#808080" style="border-collapse: collapse">
        <tr>
        <!-- $lists AS $k=>$v -->
                <td>{$v}</td>
                <!-- ROW:3,#ffffff:#dcdcdc -->
        <!-- END -->
        </tr>
</table>
2007-8-27 10:43 AM#4
查看资料  发短消息  QQ  顶部
 
奶瓶 (NP博士)
版主
Rank: 7Rank: 7Rank: 7
老仙


UID 52707
精华 4
积分 5408
帖子 5939
金钱 5358 喜悦币
威望 50
人脉 0
阅读权限 100
注册 2004-11-22
来自 北大中文系
状态 在线
[推荐阅读] 请问php有filter么
根据啥说是20倍呢?




图片包子,注册送100包子!
2007-8-28 12:57 AM#5
查看资料  访问主页  Blog  发短消息  QQ  ICQ 状态  Yahoo!  顶部
 
bnini (bnini)
中级会员
Rank: 3Rank: 3
中级会员



UID 12628
精华 0
积分 415
帖子 447
金钱 415 喜悦币
威望 0
人脉 0
阅读权限 30
注册 2002-2-2
来自 上海
状态 离线
[推荐阅读] 请教一个用PHP 发邮件的问题!
怎么可以保护变量,有些变量不需在模板中出现

[ 本帖最后由 bnini 于 2007-8-28 12:45 PM 编辑 ]
2007-8-28 12:44 PM#6
查看资料  发短消息  顶部
 
robinhunan
注册会员
Rank: 2
一般会员



UID 20392
精华 0
积分 180
帖子 150
金钱 180 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2003-6-3
状态 离线
[推荐阅读] 我母亲仙逝了
看后面的两个vs代码, 实际测试文件包含的时候,是smarty的 50倍,就是一个hello就要比smarty快8倍,
速度快得益于smarty太臃肿。

怎么可以保护变量? 我的理解比如{$title} 实际上并没有$title这个变量? 貌似这个很难

  但是用户得到了$title 这个变量,表面上有影响,实际上是不用想php中肯定存在$_GET的
如果心里踏实一点把模板放在网站不能访问的地方 :)
2007-8-28 03:24 PM#7
查看资料  发短消息  QQ  顶部
 
细雨清风 (广告位20元/月)
金牌会员
Rank: 6Rank: 6
管理员


UID 71720
精华 0
积分 2994
帖子 361
金钱 7 喜悦币
威望 0
人脉 2987
阅读权限 70
注册 2006-4-15
状态 离线
[推荐阅读] ECSHOP加盟康盛创想
等别人去确认它的速度,我现在懒得看那么多的模板,我现在觉得windows雄霸天下其实也是有很多的好处的。



广告位10元/月 本船以为,性感就是让男人有"想看看这件衣服里面有什么"的欲望的样子.
2007-8-28 03:33 PM#8
查看资料  发短消息  顶部
 
zdw999
中级会员
Rank: 3Rank: 3



UID 81322
精华 0
积分 293
帖子 219
金钱 293 喜悦币
威望 0
人脉 0
阅读权限 30
注册 2006-10-10
状态 离线
[推荐阅读] 关于控制FTP上传的疑问
其实很明显,大家都想借SMARTY来推广自己的东西,如果你真写的比smarty好,早就被PHP官方认可了,而不会认可的是smarty了,不信你email到php官方试试
2007-8-29 05:31 PM#9
查看资料  发短消息  顶部
 
goshawk
注册会员
Rank: 2
初级会员


UID 67921
精华 0
积分 71
帖子 513
金钱 71 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2006-1-10
状态 离线
[推荐阅读] 高薪急聘开发人员,创客中国欢迎您的加盟


QUOTE:
原帖由 奶瓶 于 2007-8-28 00:57 发表
根据啥说是20倍呢?
楼主
2007-9-1 09:07 AM#10
查看资料  Blog  发短消息  QQ  顶部
 20  1/2  1  2  > 
     


  可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题 | 开通个人空间  


 




Powered by Discuz! 6.1.0  © 2001-2010 Comsenz Inc.
Processed in 0.049835 second(s), 6 queries

(冀ICP备05009913号) 管理员:sadly 邮箱/MSN: sadly@phpx.com QQ:824008(长隐) 清除 Cookies - - Archiver - WAP