uchome是个sns系统,但也是拥有深厚php技术积累的康盛公司的商业产品,本身有许多值得学习的地方,你可以用它来架设垂直的sns网站,也可以学习他的一些技巧,提高自己的代码水平,改善代码质量。
对于php开发而言,轻量的东西总是受青睐,cake,zend framework这些框架虽然很好,但是对于规模比较小的系统而言,还是过了些,利用从uchome里裁剪出来的东西,就能用简单适度的方式把系统做得足够好。
uchome的整个结构很简单,虽然也是mvc的模式,但严格来讲,并没有自己实现一套model,直接用数据库返回的对象,view是通过自己实现的一套模板方法来做到功能代码和界面设计的分离。
uchome的框架比较核心的几个文件:
source/function_
提供常用的函数,例如获取post过来的字符串,获取用户身份,插入数据,更新数据,日志,模板调用接口,其中getstr,insertable,updatetable几个函数非常实用和方便。
看看gestr的函数参数;
function getstr($string, $length, $in_slashes=0, $out_slashes=0, $censor=0, $bbcode=0, $html=0)
截取字符串,转义字符,html化,bbcode都在里面
插入和更新数据的方式也非常简单,不用你自己拼接sql,以插入数据为例:
function inserttable($tablename, $insertsqlarr, $returnid=0, $replace = false)
我们插入员工信息,则可以这样写:
inserttable('staffs',array('name'=>'hankshuang','post'=>'de','age'=>25),1)
source/function_
模板函数文件,提供模板文件的解析方法,被function_common文件中的template调用,将template目录下文件解析成文件,将模板语法的代码转义为,用 loop 来指代 foreach,解析的代码也不复杂,有兴趣可以仔细阅读下function_文件里的parse_template方法,都是调用preg_replace进行正则表达式替换,通过这种方式,你就不用去编写混杂着'hankshuang','age'=>25)
就调用方法
cache_write('staffcache','staff',$staff)
下次想用这个内容的话,直接include data目录下的这个data_staff文件,就得到$staff这个对象了,原理简单,用起来却很方便.
有这三个文件,就足够你打造一个快速实用的系统了,当然uchome里还有一些非常好用的函数,比如图像处理,邮件发送,定时任务这些,设计都很巧妙,对于提高php开发技能很有帮助。
1.1.3uchome之配置表缓存 做为sns站点,相比cms站点,动态性要求高,生成静态页面价值不是太大,变更因素太多,因此uchome的缓存一方面是view的缓存,也就是template的缓存,一方面则对每个页面都需要的配置文件做了缓存,减小数据库服务器的负荷.
在home/中,对配置的读取是这样的:
//配置文件
if(!@include_once(s_root.'./data/data_')) {
include_once(s_root.'./source/function_');
config_cache();//更新配置文件
}
data/data_文件是通过config_cache()来生成的,看看function_文件中的具体实现:
//更新配置文件
function config_cache($updatedata=true) {
global $_sglobal, $_sconfig;
$_sconfig = array();
$query = $_sglobal['db']->query('select * from '.tname('config'));
while ($value = $_sglobal['db']->fetch_array($query)) {
if($value['var'] == 'privacy') {
$value['datavalue'] = empty($value['datavalue'])?array():unserialize($value['datavalue']);
}
$_sconfig[$value['var']] = $value['datavalue'];
}
cache_write('config', '_sconfig', $_sconfig);
.....略去部分
}
将配置表中的数据读到$_sconfig这个数组中,并利用cache_write写到缓存中,cache_write代码如下:
function cache_write($name, $var, $values) {
$cachefile = s_root.'./data/data_'.$name.'.php';
$cachetext = ;
if(!swritefile($cachefile, $cachetext)) {
exit(file: $cachefile write error.);
}
}
看明白了吗?这段代码就是将hash变量变成可以直接包含的代码存到文件里去。
比如你写一个 cache_write(test,hanks,array(strong=>1,good=>1,nice=>1))
最后你会得到一个data_文件,里面的内容是
if(!defined('in_uchome')) exit('access denied');
$hanks = array(strong=>1,good=>1,nice=>1);
更复杂的嵌套也可以arrayeval会进行字符串的转换。
生成php文件进行缓存是uchome最常用的模式,template也是这样,简单实用
1.1.4uchome数据库访问 在space_文件中,我们看到这样的查询代码:
$query = $_sglobal['db']->query(select * from .tname('friend'). where uid='$space[uid]' and status='1' limit 0,6);
$_sglobal['db']是怎样的一个对象呢?在function_文件中找到答案:
function dbconnect() {
global $_sglobal, $_sc;
include_once(s_root.'./source/class_');
$_sglobal['db'] = new dbstuff;
$_sglobal['db']->charset = $_sc['dbcharset'];
$_sglobal['db']->connect($_sc['dbhost'], $_sc['dbuser'], $_sc['dbpw'], $_sc['dbname'], $_sc['pconnect']);
}
原来是class_文件中的dbstuff对象
dbstuff类中最重要的方法就是connect()和query()方法,connect负责开启数据库连接,具体取数据就靠query了,query的核心代码如下:
$func = $type == 'unbuffered' && @function_exists('mysql_unbuffered_query') ?
'mysql_unbuffered_query' : 'mysql_query';
if(!($query = $func($sql, $this->link)) && $type != 'silent') {
$this->halt('mysql query error', $sql);
}
刚看的时候没找到查询语句怎么执行的,后来发现是个小技巧,声明了一个变量$func,进行type判断后,赋值为“mysql_query”,然后$func(),就等于mysql_query(),这个技巧熟悉ror的同志肯定不会陌生。