PHP:UChome分析

WBOY
WBOYOriginal
2016-06-23 14:34:35818Durchsuche

1.1.1代码结构 1.1.2uchome的框架核心

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进行正则表达式替换,通过这种方式,你就不用去编写混杂着

 

source/function_

提供缓存的写入和更新,最重要的方法就是cache_write方法,看看声明:

function cache_write($name, $var, $values)

如果我想把员工数据缓存起来,那么对于$staff = array('name'=>'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(!defined('IN_UCHOME')) exit('Access Denied');\r\n".

        '$'.$var.'='.arrayeval($values).

        "\r\n?>";

    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的同志肯定不会陌生。

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:PHP日历【转】Nächster Artikel:PHP realpath() 函数