道可道,非常道—PHP模板技术

道可道,非常道—PHP模板技术

道可道,非常道。

当我第一次见到php模板的时候,简直被迷上了。原来php世界里还有这么好的东西。我疯狂地学习。
好在当时的php模板还不是很庞大,很快我了解了它的原理,并也能自己写一些了。
后来,smarty横空出世,更是拥有了许多为它着迷的fans.许多人开始写模板引擎,将smarty或其他模板加以改造,使之符合自己的需要。
纵观当今模板世界,php模板引擎主要分为两种:
一种是替换特定字串型的。美工做出来的页面,中间会嵌入一些什么{block.title}这样的字符串,然后程序读入这个模板文件,将中间的{block.title}的字样替换成实际从数据库中读取的内容。
还有一种符杂一些,是一种编译型的。以smarty为代表,模板文件中实际上包含了一些简化的php代码,比如有的写的是<{=$site_name}>,<{if $counts>0 }>这样的语句,实际是一种自行定义的语言格式。web开发久的人一眼能看出它们指的是什么。这一类往往会在第一次访问时被预编译,转换成一个php文件何存起来。比如 <{=$site_name}>就变成了,<{if $count>0 }> 就变成了0) {?>。从第二次起,就直接包含已经编译出来的php文件。当然,各种模板的处理的具体细节不一样。

但是,我们为什么要用模板?
这个问题我也不能很好的回答。但是有很多人这么说:要让美工和程序员的工作分开。要让代码层和表现层分开。
那么我们看这两种方式实现了吗?
让您的美工人员打开一个smarty文件,让他按他的思路去改一下视图设计。他会告诉您,天哪,你怎么把我的设计变成这样一幅样子了?这些foreach,if都是什么意思?噢,天哪,我的表格怎么撑得这么大了?….
原来编译型的模板技术让美工更没法子做美工了。
那么替换字符串型的呢?看起来是轻松多了。不过您可以测测您的程序速度,看看他是否已经慢了一倍以上。很容易,您用了太多的有preg_match,或是str_ireplace之类的语句来替换。程序重复一次又一次在您那几万个甚至更多字节的模板文件中查找某个字串,来替换内容。
不仅如此,你还发现您哪天想在视层面插一点东西时,处处受制于模板。您肯定很想直接在模板中写一段之类的语句,但是,很抱歉,您不能这么写。如果只是想echo 一个什么东西,您可以在模板中加一个{{var}}的串,然后在php程序中写
$var=”这一个串”;
$template->assign(“var”,$var);
但是如果您不是想输出呢,想做其他操作?抱歉,您还是得改php代码。这些模板都支持规矩矩的表格状的输出,但是,如果我想输出20条记录,我要弄一个第一行2列记录的,第二行3列的,第三行又是2行的之类的,或者是其他类似找码,您打算怎么办?
难道再让您的模板引擎也升级成为编译性的,好让您往您的模板中加入php语句?

您错了。其实,我们看一看,我们的模板引擎充当了什么样的角色呢?我们把一段特定的按一定规则编写的html代码进行一定的数据处理后输出成了另外一段,输出过程中某些字符发生了改变。那我们的伟大的php干了什么呢?它帮我们把我们按规则写好的php代码也按一定规则输出成了一段html。两者本质是一样的。只是,php本身比我们那些蹩脚的模板引擎更快,更漂亮。
再说细一点,现在用的最多的Smarty.看一看它的结构:

<{if $article.rates}>
<{php}>echo art_constant(“MD_RATE”);<{/php}>:
<{$article.rating}>/<{$article.rates}>
<{/if}>

你觉得它是一个美工能看清的html文件么?
看看编译后的结果,它看起来应该是这样的:


:
/


哈。我们伟大的smarty把这html也变成了php了。然后在以后的工作中,这些php代码会直接被运行。
有必要吗?本来是apache承载php,php直接编译php 源代码,现在变成了apache承载php,php编译smarty引擎,smarty引擎又去编译html文件。反而多了一层,smarty自个儿把本来php要做的工作拿了做了。
而且糟糕的是,smarty的模板打开来以后,比php文件更让人难以看清。
所以我说,放弃您的模板系统吧。但记住我们开发模板系统的初衷。

您会说:那要是放弃模板系统了,我怎么分开程序逻辑和视图层面?
这个也太好办了。您可以这样写:
第一个文件这样写:


@link http://www.162cm.com
*/
$rs=mysql_query(“select id,title,body from articles order by id desc limit 30”);
while($row=$mysql_fetch_assoc($rs))
{
$rows[]=$row;
}
?>

第二个文件作为您的视层面的文件。您可以让您的平面设计师在mac上设计漂亮绝顶的图片,然后切成html文件,交给您的页面整合工程师。这个工程不需要懂太多php,他基本上只需要会用print就行了。他把这个html文件改名为view.php,然后在里面加上相应代码:


@link http://www.162cm.com
*/
foreach($rows as $row)
{
echo “

“;
echo “

“;
echo $row[“id”];
echo “

“;
echo “

“;
echo $row[“title”];
echo “

“;
echo “

“;
}
?>

ok.这就视层面文件。这个文件用织梦者(dreamweaver)打开后,应该跟美工做出来的图是一样的,就仅仅多了用那个黄色的问号代表的php代码。写得好时,dreamweaver还能列出您的php代码中输出了什么内容,效果更佳。
这两个文件,就是一个是逻辑层,一个是视层面。
然后用index.php将他们包含起来。


@link http://www.162cm.com
*/
include “databaseConnect.php”;//连接数据库的代码,我就不写了
include “logic.php”;
include “view.php”;
include “cache.php”;
?>

这样逻辑和视,就分开了。那有人会说,如果我用模板,可以将要输出的内容写入到静态文件中,现在没了模板我该怎么办?
这个不是问题。我们用的是php,超酷的php.
看看,我们加了cache.php.这就是用来实现您说的缓存效果的。
我们的cache文件:


@link http://www.162cm.com
*/
$content=ob_get_content();
$fp=fopen(“index.html”,”w”);
fwrite($fp,$content);
fclose($fp);
?>

当然,index.php也改成:


@link http://www.162cm.com
*/
if(file_exists(“index.html”))
{
include “index.html”;
exit();
}
include “databaseConnect.php”;//连接数据库的代码,我就不写了
include “logic.php”;
include “view.php”;
incldue “cache.php”;

?>

这样您看这缓存效果是不是就出来了?

有人说:我用模板还有一个好处啊,就是模板写错了还不会影响到程序的运行。是的。咳,怎么说呢?您在模板中将<{=$site_name}>写成了<{=$sie_name}>是没啥,您的php程序还是很”健壮”地运行着。不过您没觉得,当您期望的那一个将由<{=$site_name}>来打出来的网站名称没有出现的时候,您排起错来会很难找吗?对于一个程序师来说,您不觉得,光只视层面的那些echo语句,只应该是您工作中极微不足道的一部分吗?在这个主要是echo语句构成的视层面文件view.php,您还出现编译期错误,是不是该拉出去打屁屁?

另外,在php程序正式上线运行时,您也可以将它的报错功能关闭啊。

常道,亦非常之道。
无为,无所不为。

替女友感谢一些曾经关注过帮忙过的朋友

她不打算来北京了.北京这边一些单位的面试她也不参加了.
我白忙活了.害大家也白忙活了,对不住.尤其今晚还加我msn问她的情况的朋友.
谢谢各位的关心.
只怪我无能,到现在还啥都没混上。女人不愿意过不确定的生活,我理解。现实的比梦想中的更可靠。每个人都不喜欢冒风险。女人最甚。
有些事注定会发生。正如天要下雨,拦不住的。
我尽力为之。若事难成,我自己接受自己的惩罚而已。
睡吧。不早了。
上班,打卡。
生活。。。
活着。。。

又要做擦屁股的事

上半年,就光在做给人擦屁股的事。
这次是全新开始,倒是不用擦了,不过现在xoops在使用中也有问题,看来的得给xoops擦擦屁股了。
xoops现在确定的不足之处有:

1:保留了太多的古老的代码,速度不够快。
2:设计时考虑了区块,风格,但仍然不能解决一个大问题:就是目前大多数的xoops看起来都太单调,设计上难以突破。这也是因为美工能做的事太少—Xoops的模板/风格文件打开以后,每个美工看了都会头晕。
3:设时之初没有考虑到AJAX应用问题。
4:搜索引擎优化工作没有做好,应该有选择地应用mod_rewrite

但是xoops有如此多的插件支持,所以,难以舍弃。那只好再给它擦屁股了。一个字,改.

Cakephp在Windows Server上无法用mod_rewrite的问题

有些朋友问在windows 2003 上为什么无法正常使用cakephp.
环境是Win2003+ Apache+PHP4.4.4
我自己试了一下,可能是这样几个原因:
1.Apache中没有启用mod_rewriet选项。
可以打开apache安装目录中的conf/httpd.conf,找到这样一行:

#LoadModule rewrite_module modules/mod_rewrite.so

把前面的#去掉,变成:

LoadModule rewrite_module modules/mod_rewrite.so

(Apache 2中没有这一步)并找到

#AddModule mod_rewrite.c

也把#去掉,变成

AddModule mod_rewrite.c

就顺利地启用了mod_rewrite.Windows版本一般都带有mod_rewrite.so文件。

2.”.htaccess”文件不存在或错误。
在winxp或Windows 2003中,是不允许直接建立”.htaccess”文件的。windows要求我们建立文件时可以不要扩展名,但必需要输入主文件名。不过我们有一个超级简单的办法:直接让朋友给传一个.htaccess文件,哈哈,windows没有限制下载并保存这样的文件。
还有一种方法,要能要麻烦一些,但在找不着人帮忙时也是有效的:
打开apache安装目录中的conf/httpd.conf,找到这样一行:

AccessFileName .htaccess

将之改为你想取的名字,比如: stupidcake.htaccess:

AccessFileName stupidcake.htaccess

哈哈,这就可以了。你现在不用建立.htaccess这个文件,只需要建立stupidcake.htaccess文件就行了。不过千万不要太傻,又改个什么”.ht”之类的文件名.

燥动…

难受。真想找一安静的地方,过过青灯古佛的生活。
又一个创业者了。
找我,我心里也乱。我对自己现在做的不满意,但和他们一起做,薪水是涨了许多,可是我也未必对自己的表现满意。我真不知如何我才对自己满意。
联想到几天前老同学找我一起干,不知道这个世界怎么了。
我会是一个好创业者吗,我想。
不得不把被我一师兄挂在msn上觉得颇有感触的话贴出来:(这话好像也是我说的,她挖我过去,我当时不知道想什么,这么说了一句)
我究竟喜欢什么,追求什么,想得到什么?

创业,亿万富翁,80后富翁,可能离我非常远。我还是好好打工。骂我是懦夫吧。我一辈子就只配给别人打工了。
一个月之前某个人说的话,我会记住一辈子。

家家有本难念的经啊

晚上在QQ上跟老婆聊天,她又抱怨说我对她不好,说手机坏了没钱买新的之类。这些我也听着烦,跟她争了一会儿,又想想不对,还是赔了个小心。
工作还是在帮她争取,不过说实话,她想找个教师职业,真的很难。虽然她说找到很多招人的,可是我知道,北京找工作的人可是远远比能提供的职位多啊。只能祈祷了。
到Aw的blog上逛了逛,发现他也有不少烦心事…. 想象中以他的能力,收入应该不错,生活应该好点儿吧,没想到他也在为租房之类的事儿闹心。忽然从他又想到了之前的那个高个儿MM,唉,那高度,那身材,绝对是让我自惭形秽的那种。不过人家也每天烦着一件事:个儿太高了,实在不好找比她还高的Boyfriend,勉强找了一个,比她矮一点点,两人的收入也紧巴巴的… 据她说在初中时就已经这么高了,一直郁闷自己为什么不矮一点儿(我还想自己为什么不高一点儿呢). 然后Msn上另有仨MM,一个北京,一个上海,一个苏州,都是清新可人的白领丽人,收入也相当可观,一个私企老总,另两个都在外企。人条件啥都好,可人也有闹心的事儿.这事儿也怪,啥都好,却都找不着男朋友。没法子,男人都那德性,不喜欢比自己优秀的女人。所以这三位都在MSN上挂着:想结婚了,相亲征集中…. (我说这什么事儿了,以为只有我这样的挫人才会担心讨不着老婆,没想到人家也有才女愁嫁的。)一度我的MSN列表中同时仨人挂着想结婚了的字样,成为一大奇观。
还认识一哥们儿,拥有我做梦都想拥有的收入水平,可人家也有郁闷事儿:每天都得不停应酬,陪人喝酒,装孙子,没法儿,谁叫你是老板呢,一天喝三顿,那是常事。。。喝到高血压酒精肝什么的全有了…
唉,想着这些,我反而自得了。。。哈哈,虽然俺们是穷人,但我们还是相对比较幸福的….

CakePHP入门…译文,请勿转载.

CakePHP入门

第一部分:

什么是CakePHP?

cakephp是PHP的一个免费的快速开发开源框架。它是一些最早是在Ruby on rails中闪现的天才创意的让程序员来创建应用的库,类和运行时构件而构成的结构。我们的最大目标是希望能让您以一种良好的组织和快捷的开式来工作,并且,还不损失其灵活性。

第二部分:

为什么要用CakePHP?

CakePHP有一些很好的特性,这使得它将当仁不让地成为您快速开发时最好的开发框架。这里是一些特性,注意并没有特别排序.

  • 活跃的,友好的社区支持
  • 宽松的许可制度
  • 能兼容PHP5和PHP4.
  • 程序代码自动生成
  • Model,View,Controller 架构。
  • 看起来比较漂亮的URL
  • 内建的检查认证支持
  • 快速而灵活的模板支持(支持PHP语法,有帮助文档)
  • 安全,会话,请求处理组件…

权限控制。。
数据清理
可以工作在任一个子目录下,只需要一丁点儿配置..

 

第三部分:

CakePHP的历史:

2005年

Michal Tatarynowicz用php写了一个很小的快速开发的框架。他认为这将是一个很好的开发框架的起源。

Michal Tatarynowicz后来将他在MIT的条款下发布,给他取名Cake,并展示给一群开发者,这些人后来继续维持着Cake,虽然此时已经改名为Cakephp.

 

cakePHP手册(译文,勿转载)

序言

第一部分:听众应当是谁?

这个手册是写给那些希望快速并且轻松地创建web应用程序的人们。CakePHP旨在帮助各种水平的PHP用户们

轻松、快速地创建功能 强大而又具备良好的可扩展性的程序 。

阅读这本手册需要您对PHP,HTML有一个基本的了解。如果您对MVC的设计模式有所了解那是更好,不过,即便您是一个MVC的新手,也不用急,我们会慢慢带您入门。这本手册当然会教那些在配置WEB服务器等问题上遇到麻烦的读者,但完全覆盖这些显示超出了本手册的范围。

一些初步的知识,基本的的解围技巧,相关的历史和关系,会在这个手册里加以说明,虽然这已经超出了本手册的范围。

第二部分:CakePHP是免费的

Cakephp是免费的,您不需要为它付一个铜子儿,您可以以任何需要的方式使用它。CakePHP是基于MIT的那些条款来发布的。Cakephp是一个开源软件,这意味着您可以得到它的全部源代码。得到它的最好方式是访问它的官方网站(http://www.cakephp.org);您也可以在这个网站上看到一些最新发布的或是非常酷的代码。

第三部分:

CakePHP是由一个工作非常努力的社区的人们来开发的。他们来自世界各地,聚到了一起为千万用户,尽可能多的用户能用上这么一个好的框架而努力工作。您可以访问http://www.cakephp.org来得到关于cakephp的活跃用户和开发者的更多信息。

我们的IRC聊天室总是有许多知识扎实,乐于助人的朋友。如果您为一个代码问题而伤神,或是需要一位聆听者,或是想发起一场关于编程习惯的讨论,拿起您的话筒吧(这点我有点不确定,原文是Drop on by.我猜的..)。我们期望听到你的声音。请到irc.Freenode.com的#cakephp房间来找我们吧。

 

Cake PHP 简介(译文。。勿转载)

为什么选用它(cakephp)?

令人兴奋的特性

  1. Model,View,Controller 架构。
  2. View Helpers for AJAX, Javascript, HTML Forms and more
  3. 内建的检查认证支持(原文:Built-in Validation)
  4. 程序自举。。
  5. 程序代码自动生成..(原文:Application and CRUD code generation via Bake )
  6. 权限控制。。
  7. 数据清理。。
  8. 安全,会话,请求处理组件…
  9. 灵活的view层缓存…
  10. 其他特性…
  1. 活跃的,友好的社区支持—您只需要加入我们的IRC聊天频道,看一下都是谁在哪儿!我们非常乐意为您效劳。
  2. 宽松的许可制度---cake是基于MIT 条款发布的.
  3. Clean IP(实在不懂IP是指什么…也许是指绝对核心的开发人员) 每一行代码都是由Cakephp的开发队伍编写的..
  4. 相当简单—正如您知道的,它叫小甜饼,美味可口。
  5. 快速开发—从来没有这么过快过…(您可以看zZine的文章..)
  6. 良好的实用性–Cake 易于理解,并且,和其他特性相比,在安全认证和会话管理中实现了工业级的高标准。(原文:Best Practices – Cake is easy to understand and sets the industry standard in security authentication, and session handling, among other features. )
  7. 基于对象的—不管您是富有经验的OOP老手,还是一个OOP入门者,您都都会用的得心应手。
  8. 不需要配置–您只需要装上数据库,然后等着这美妙的一切吧。

噢,天哪,看看人们怎么说Cake?

  1. Cake 简直救了我的命。-sdevore
  2. Cake developers are smart cookies. — sunsetfind.
  3. 我喜欢Cake — rpeterson
  4. 一旦您拥有了Cake,就不想失去它了… — j_king
  5. 我们需要一个文档,来教我们如何用Cake来做任何事情. — Jonathan Snook

PHP读取BT文件的代码之改进版

今天再看了一下bt文件的具体编码方式 ,又改进了一下代码,几乎是重写了,这次能读入所有信息到数组了,并且字典中的数组进行了一些配对。


输出读入的数组。
*/
print_r($data);
/**
@function readbt 读入bt文件;
@param $fp 文件指针
@param $nowtype:当然的元数据类型
@return Array 一个保存当前元数据集的数组
*/
function readBt($fp,$nowtype=”DICT”)
{
$nowindex=””;
while(!feof($fp))
{
$char=(string)fread($fp,1);
/**
其实仔细研究一下,可能这里几个case的摆放位置,比如哪个在前哪个在后,对速度都是有影响的,不过咱们暂时不管它
*/
switch($char)
{
case “1”:
case “2”:
case “3”:
case “4”:
case “5”:
case “6”:
case “7”:
case “8”:
case “9”:
case “0”:
{
$nowindex.=$char;
break;
}
case “:”:
{
$nowtype=”STRING”;
$string=fread($fp,intval($nowindex));

$VARS[]=$string;
$nowindex=””;
$nowtype=””;
break;
}
case “i”:
{

$nowtype=”NUMBER”;
break;

}
case “e”:
{
/**
e是一个编码结束的标志,要看当前是何种编码。如果是number,直接保存当前读入的一系统数组;如果是列表(list)或字典(dictionary),则返回数组。
*/

switch ($nowtype)
{
case “NUMBER”:

$VARS[]=intval($nowindex);
$nowindex=””;
break;
case “LIST”:

return $VARS;
break;
case “DICT”:

return $VARS;
break;
}

break;
}
/**
当开始一个列表或字典时,我为了让结果数组更清晰地显示目录关系,使用了递归。也可以不使用递归。
*/
case “l”:
{
$nowtype=”LIST”;
$VARS[]=readBt($fp,$nowtype);
break;
}
case “d”:
{

$nowtype=”DICT”;
$VARS[]=readBt($fp,$nowtype);
break;
}

}

}
return $VARS;
}
fclose($fp);

?>

结果还可以用函数再处理一下,不过这个就比较简单了。解析出来后,就能比较容易地读取bt文件并分析当前该种子里的文件名,发布者和节点信息。
大学那会儿特想弄清bt文件的结构,现在知道了,反不想去细了解了。