设为首页 收藏本站
查看: 594|回复: 0

[经验分享] PHP:UChome分析

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-8-26 07:18:09 | 显示全部楼层 |阅读模式
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目录下文件解析成文件,将模板语法<!--{if $staffid}--><!--{/if}-->的代码转义为<?php if ($staffid) {?><?php } ?>,用 loop 来指代 foreach,解析的代码也不复杂,有兴趣可以仔细阅读下function_文件里的parse_template方法,都是调用preg_replace进行正则表达式替换,通过这种方式,你就不用去编写混杂着<?php 和html的代码了,眼不见为净。性能的提高?交给下面的cache吧
  
  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 = "<?php\r\n".
          "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判断后,赋值为&#8220;mysql_query&#8221;,然后$func(),就等于mysql_query(),这个技巧熟悉ror的同志肯定不会陌生。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-104202-1-1.html 上篇帖子: 10款PHP开源网店系统 下篇帖子: PHP、Java、C#实现URI参数签名算法,确保应用与REST服务器之间的安全通信,防止Secret Key盗用、数据篡改等恶意攻击行为
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表