7天突破:PHP新手应用MooPHP框架开发实战
[b]php是一门非常优秀的语言,MooPhp是一个解决实际问题非常精炼的框架。[/b]本人绝对的PHP新手,只有一些asp开发经验。此前总觉得PHP非常复杂,那些{} 大括号让人看起来非常反感,所以一直没有接触。直到公司项目中游网([url]http://www.cgame.tv[/url]) 以流行的ruby on rails框架开发,然而在实际使用过程中遇到严重的负载和性能瓶颈,需要解决方案时才考虑使用php。选择PHP的理由是,java的开发效率是我们不愿意看到的,作为中小团队我们不希望陷入java开发的周期中,.net完全不考虑了,我们肯定是基于linux平台工作的。那么php就几乎是我们唯一的选择了,同时我们也认为自己的项目属于“中小项目”,所以我们基本确定选择php.
[b]团队在接触php后最大的抱怨是:与php相比,写ror简直是享受……[/b]
真的是这样么?看来我有必要学习一下php了…… 对我来说,这是个挑战。
首先,根据我仅有的代码经验,我知道php是相对“正常”的语言,它至少不是完全面向对象的。因此我接触它需要了解的无非是语法规范、数据传递、流程控制、函数等内容。[b]所以我找了一篇大概叫《10天攻克php》的教程,花了几个小时看了看必要的内容[/b]:主要是语法规范和一些常用的数据传递方面的内容。这个教程分10篇讲述不同的问题,后面的包括上传、发送邮件之类的内容对新手来说就完全没有必要看了。对于我这样的新手来说需要了解的无非是php的全貌是什么而已。
[b]然后,我需要一个很好的参考手册。很幸运,我很快找到了 PHP参考手册([url]http://www.w3school.com.cn/php/php_ref.asp[/url])[/b].不得不说一下,w3school.com.cn做事非常认真,确实是一个web开发者需要收藏的参考手册网站,包括所几乎所有web开发技术的参考手册。有了它,你完全没有必要大事儿小事儿先百度一下,你需要做的就是了解你的问题,然后找到手册上的相关参考,然后解决问题。但是缺点也非常明显:没有一个像样的站内搜索,仅仅使用了google的站内搜索,很多时候找点东西很不容易。我只好在屏幕上ctrl+F寻找我的目标内容。
有了这些我就可以开始工作了吗?如果立即开始恐怕我的开发经历肯定是极端痛苦的,写出的代码肯定也不能看。这时候我试图去找一个能解决我的实际需求的框架。先了解我的需求:非常简单,能够快速开发,在常见问题上能够提供快速解决方案。比如数据的验证,上传,分页等不需要我在这些常规的事情上花费很多时间,让我有更多精力关注我的应用本身和用户体验。这里多说两句,我喜欢把我我常用的东东“抽屉化”,也就是说我需要哪个代码片段的时候,我可以像打开抽屉一样拿出来就用,不用费劲的重写一遍。这里表扬一下DW的代码片段功能,善用它,可以让你少打很多洋文字母,是个提高效率的好工具。
我开始寻找框架,查阅资料发现php框架林林总总,非常的多,一时晕头转向。这时候恰好看到了《phper》电子杂志,那期主要介绍uch,顺道说一下uch也是我非常感兴趣的应用,我希望下一个应用在uch的基础上开发。杂志顺带介绍了moophp框架,文章是10分钟开发一个blog。因为ror有个著名的10分钟blog的教程,所以就尝试了一下。说实话用moophp10分钟开发一个blog是不可能的事情,blog虽小但涉及的问题却多。况且这个教程写的行云流水,完全不适合新手阅读,期间遇到了相当的困难,这里就不说了。
为了快速开始,php环境非常重要,我也知道很多人都是在环境这一步花费了N多功夫,最后垂头丧气,第一步就很不愉快。为了避免不必要的问题,环境这一步不能花费太多时间。于是[b]我选择了phpnow环境(linux 下我选择了XAMPP for linux)[/b],建议下载PHPnow-1.4.5-20版本,另一版本好像有些问题,我也没有足够的时间去折腾了。操作方法非常简单,注意看readme文件即可。环境的问题基本上一二十分钟就搞定了。
想要对moophp有个基本的了解,[b]重写10分钟blog非常重要,它可以让你更深入的了解moo.[/b]
遇到的第一个问题就是目录配置问题了,以前从来没有接触过“./”的含义,后来明白 “./” 表示当前目录。
moo将view层的内容放在moo_templates 目录下,而 c和m的内容放在站点的根目录下,基本还是分层的模式,这样的好处非常明显:应用moo的模板语言可以很方便的完成页面的表现部分,而且程序和html尽量分开,两者其一有任何更改的话都会比较方便。
在仿写10分钟blog的过程中对moo的文件结构和模板语言有了基本的了解,同时也体会到了moo的开发效率显然高于asp,但是开发思路基本和asp没有太大的区别。
有了这个基础之后,决定开始用moophp改写我已经用ASP完工的网站 4399电影网([url]http://www.4399movie.com[/url]),大家现在看到的版本即是已经用moophp改写之后的版本。服务器用的是hostmonster,大家顺便帮我测试测试速度啦,谢谢哈。
4399电影网([url]http://www.4399movie.com[/url])的基本定位是,提供电视剧在线观看的垃圾网站。但是又有一些稍微特别的功能,至少不能太垃圾了,就是所有电视剧相关的信息,如导演、主演、编剧等等内容全部标签化,通过标签可以迅速找到你所感兴趣的内容,在seo层面的意义在于加大整个网站的内联,使各个内容间简历错综复杂的广泛联系。
[b]需求基本列表如下:[/b]
1、4399电影网 ([url]http://www.4399movie.com[/url]) 提供电视剧图片、介绍和其他相关资料。
2、提供电视剧集的在线播放,主要是转帖优酷、土豆之类的网站视频,自己存放视频的服务器和带宽开销不是个人所能承受的,同时人工成本也不可接受。
3、整站标签化,一切皆为标签,广泛网站内部链接。
4、出于效率和seo方面的考虑,网站url应该简短化,因此后期使用php的url rewrite技术使url对搜索引擎友好化,即伪静态。
5、出于维护方便性的考虑,网站不应该生成静态文件,静态文件的维护策略非常麻烦。相应的采用就需要尽可能的采用缓存机制减轻数据库和程序的压力,很幸运moo有比较完善的缓存机制。
[b]后台需求如下:[/b]
1、对电视剧进行管理,要求增删改查。
2、对标签进行管理,标签应设置状态,未审核的标签不参与前台热度的排行。
[b]前台的功能基本如下:[/b]
1、4399电影网 ([url]http://www.4399movie.com[/url]) 提供电视剧的在线播放。
2、提供最新的电视剧。
3、提供热门电视剧,本周热门和本月热门。
4、提供热门标签,以本月热门为标准。
5、提供电视剧的检索功能。
[b]4399电影网 ([url]http://www.4399movie.com[/url]) 后台数据库基本如下:[/b]
表 movies 负责储存电视剧相关信息;
表 jis 负责储存剧集相关信息;
表 tags 负责标签相关信息;
表 logs 负责记录标签热度和剧集播放次数等相关信息;
[b]4399电影网 ([url]http://www.4399movie.com[/url]) 程序文件如下:[/b]
list.php 负责最新电视剧、标签相关电视剧、搜索结果的展示;
movie.php 负责单个电视剧的展示;
play.php 负责剧集的播放;
[b]4399电影网 ([url]http://www.4399movie.com[/url]) 前台模板列表如下:[/b]
header.htm 负责头部展示;
bootom.htm 负责底部信息展示;
list.htm 对应电视剧列表风格;
movies.htm 对应电视剧介绍风格;
play.htm 对应播放页风格;
right_1.htm 负责播放页右侧内容,主要是热门标签、本周热门电视剧、本月热门电视剧;
right_2.htm 负责电视剧页面和播放页的右侧,主要是热门标签、本周热门电视剧、相关电视剧;
[b]缓存的应用:
[/b]
考虑到前期访问量不会太大,因此没有使用cache缓存,另一个原因是cache的过期和更新策略需要自己定,相对比较复杂,仅研究了一下如何使用,未真正采用。
考虑到热门标签、本周热门电视剧、本月热门电视剧、相关电视剧 等内容在各个页面大量使用,且本身热门条件的判定都是从logs表中综合获取因此采用block缓存,过期时间暂定24小时。在程序文件中的写法基本如下:
[b]热门标签:[/b]
本周热门电视剧:
$btime=(strtotime(date("y-m-d"))-(3600*24)*30);
$sql="select m.movie,m.zhongwenming,m.tupian,l.c_id,count(c_id) as hotsfrom movies m,logs l where type=2 and l.c_id=m.id andl.tms>".$btime." group by l.c_id order by hots desc limit 10";
$_MooClass['MooCache']->getBlock("type=query/name=cache_movies_week_hotest/sql=".$sql."/cachetime=2000");
[b]本月热门电视剧:[/b]
$btime=(strtotime(date("y-m-d"))-(3600*24)*30);
$sql="select m.movie,m.zhongwenming,m.tupian,l.c_id,count(c_id) as hotsfrom movies m,logs l where type=2 and l.c_id=m.id andl.tms>".$btime." group by l.c_id order by hots desc limit 15";
$_MooClass['MooCache']->getBlock("type=query/name=cache_movies_month_hotest/sql=".$sql."/cachetime=2000");
相关电视剧:这里的相关实际上是取出临近id的电视剧列出,[b]这里使用了一个非常巧妙的mysql方法取出临近电视剧[/b],大家可以体会一下
$sql = "select * from movies where ABS(ID-".$id.")<=5 and id<>".$id." order by ID desc ";
既然热门内容都是依赖于logs表中的大量数据汇总计算得出,因此我们需要把需要记录的日志记录
1、记录标签访问的日志;
2、记录播放页访问的日志;
我定义了一个函数来记录以上两类数据。
[b]标签的处理:[/b]
我对标签的处理可能和常规方法略有不同,但我觉的我的处理方法应该更趋于合理。要点如下
1、任何内容都可以成为标签,包括添加电视剧时加入的标签,导演、编剧、主演。
很多人会通过主要演员来寻找电视剧,比如有些xxx明星的粉丝就希望看到所有的xxx的电视剧,那我就可以把标签作为搜索关键词找出他的所有作品。
2、仅当有用户点击这个标签时才有必要记录进tags表中。
在添加标签时就记入tags表是一个方法,但是我觉的很麻烦。所以我按需入表了。当用户点击一个标签时,如果标签库内没有这个标签则记入标签库,如果有则记录标签访问日志,为热度统计做准备。
3、包括搜索的关键词,同样也作为标签处理,只要用户搜索一个词程序都会将之作为标签生成和入库。
鉴于国内严酷的互联网环境,所有标签均需人工审核才能用于前台显示和加入热度统计,以避免不合适的标签产生。
4399电影网 ([url]http://www.4399movie.com[/url]) 四通八达的标签系统就是用以上方式实现的,我尽量避免了人工成本,让系统具有一定的自成长特性。
[b]前台的最后一步url映射:[/b]
鉴于asp版本的4399电影网 ([url]http://www.4399movie.com[/url]) 已经被可爱的google收录了数千条(天杀的百度还在无作为!),所以url映射规则,只能依照asp版本的旧制,依照规则我写了.htaccess 文件,内容基本如下:
RewriteEngine On
#/RewriteBase /
RewriteRule ^index.htm$ list.php
RewriteRule ^mlist/([^/]*)/$ list.php\?k=$1
RewriteRule ^mlist/([^/]*)/(\w*)/$ list.php\?k=$1\&t=$2
RewriteRule ^movie_([0-9]*)\.htm$ movie.php\?id=$1
RewriteRule ^moviepl_([0-9]*)_([0-9]*)\.htm$ paly.php\?id=$1\&jid=$2
[b]后台的开发:[/b]
后台的开发基本上没有什么可表述的,只要遵循后台类的开发规范即可,建议直接修改 10分钟blog 的后台,这可以让你迅速熟悉后台开发的规范。
为了方便对标签的管理,满足批量审核,批量取消审核,批量删除的功能,对我最不喜欢的javascript进行了一些简单的学习,相关代码如下(写的不好,见笑了)
<script>
function checkall(){
var form=document.getElementById("form1");
for(var i=0;i<form.elements.length;i++){
var e=form.elements[i];
if(e.type=="checkbox") e.checked=true;
if(e.name=="part") e.checked=false;
}
}
function uncheckall(){
var form=document.getElementById("form1");
for(var i=0;i<form.elements.length;i++){
var e=form.elements[i];
if(e.type=="checkbox") e.checked=false;
if(e.name=="part") e.checked=false;
}
}
function submit_pass(){
var form=document.getElementById("form1");
form.action="*.php?action=tags&operation=tags_pass";
form.submit();
}
function submit_nopass(){
var form=document.getElementById("form1");
form.action="*.php?action=tags&operation=tags_nopass";
form.submit();
}
function submit_del(){
var form=document.getElementById("form1");
form.action="*.php?action=tags&operation=tags_del";
form.submit();
}
</script>
[b]我遇到的几个问题:[/b]
1[b]、moophp有没有分页类和方法?[/b]
答案显然是肯定的,但是moophp.net的文档中并未提及,需要你所有一下moophp的核心文件,用法举例如下:
php代码如下:
$pageSize = 20;//每页显示
$currepage = ($_GET['page'] == '') ? 1 : intval($_GET['page']);//当前页
$start = ($currepage - 1) * $pageSize;
$query = $db->query("SELECT id FROM movies ".$tiaojian."");
$num=$db->numRows($query);
$sql="select * from `movies` ".$tiaojian." order by ctms desc limit $start,$pageSize";
$movies = $_MooClass['MooMySQL']->getall($sql);
模板内代码如下:
<div class="cleardiv"> {php echo multi($num, $pageSize, $currepage,'mlist/'.$k.'/');} </div></div>
{template right_1} </div>
2、[b]moophp的上传功能怎么用?[/b]
仍然举一个我在实际应用中的例子。
首先,因为showForms函数未提供enctype类型,故需修改修改/MooPHP/libraries/MooAdminTemplate.class.php文件showForms 函数为:
function showForms($name, $type = '', $value='',$enctype='') {
if($type == 'formheader') {
echo '<form enctype= "'.$enctype.'"method="post" name="'.$name.'" id="'.$name.'" action="'.$value.'">';
} elseif ($type == 'formfooter') {
echo '<br /><center><input class="button" type="submit" name="'.$name.'" value="'.$value.'"></center></form>';
}
}
表单提交部分代码如下:
$admin->showForms('addsubmit', 'formheader', '*.php?action=movies&operation=add','multipart/form-data');
echo '<tr><td>图片上传:</td><td><input type="file" name="upfile" /></td></tr>';
程序处理部分代码如下:
$upload = MooAutoLoad('MooUpload');
$upload->config(array(
'targetDir' => './pic/',
'saveType' => 1,
'thumbStatus' => 1,
'waterMarkStatus' => 0,
'imageConfig' => array('thumbDir'=>'./pic/thumb/')
));
$files = $upload->saveFiles('upfile');
$dburl=str_replace("./","/",$files[0]['path'].$files[0]['name'].'.'.$files[0]['extension']);
$tupian=$dburl;
[b]我总结一下在学习PHP和MooPHP框架中的一点经验[/b]:
1、不明白或者不知道的东东,先不要着急百度,先查一下 w3school.com.cn 的在线手册,会对有你帮助;
2、MooPHP框架的文档毕竟还比较弱(和ror基本经典教程相比,moophp的教程可谓简陋),因此更需要认真查阅 moophp.net,会对你有益。
3、有些比如上传、分页等方法,实在不行搜索一下moophp的核心文件,看看函数和类如何定义的,会对如何使用有帮助。
4、实在没辙,去moophp爱好者群看看吧,现在群规模还小,一般对菜鸟问题老鸟还是有点功夫回答的。要是实在没人回答,发到官方论坛去问,一般还是有巡场在24小时至48小时内回答的。
5、最后一招,想不明白的,放一放,睡一觉,看看美女,就开窍了。呵呵。
[b]最后[/b]:
1、欢迎大家去踩踩4399电影网 ([url]http://www.4399movie.com[/url]) 我的moophp处女站。
2、我们的项目 [url]www.cgame.tv[/url] 中游网 也已经开始采用moophp框架开发,可以随时关注进展。
NEXT,基于UCH的sns 系统的改进也会采用moophp框架开发,而这个应用会放在 [url]http://paomian.pkparty.com[/url] 《泡面三国》网页游戏上。
3、MooPHP我还是新手,所以希望各位老鸟多多鼓励,多多指点,各位朋友多多交流。
4、MooPHP是解决实际问题的很棒的方案,但是仍然缺少一些类和方法,另一些则需要改进,希望官方继续开发拿出更好的框架。
5、祝愿MooPHP有更多、更好的成功案例,一步步走向成功!
[[i] 本帖最后由 eifan 于 2008-10-20 10:30 编辑 [/i]] 顶你哈哈 厉害啊 :victory: :) 不错 顶你. 我忍不住给加了精华,非常好的帖子,MooPHP因为有你们而更精彩~~~ 非常不错~~~ 很好,很强大!楼主是个牛人 厉害,这样的还叫新手啊,那么老手是怎么样的啊?
页:
[1]
