分享

cache.func.php简单分析 phpcms

 arm_embed 2012-08-08

cache.func.php简单分析 phpcms  

2010-07-27 14:56:44|  分类: phpcms代码分析 |字号 订阅


  /include/cache.func.php

  这里最先主要是定义了一些phpcms的缓存函数,phpcms的缓 存分为,表缓存,模型缓存,模型字段缓存,再有模块缓存,结束这些都是基于表的缓存的。

  最开始有一个函数

   function cache_all()

  {

  @set_time_limit(600);

   cache_common();

  cache_module();

  cache_model();

   cache_category();

  cache_area();

  cache_type();

   cache_member_group();

  cache_role();

  cache_author();

  cache_keyword();

  cache_copyfrom();

   cache_pos();

  cache_status();

  cache_workflow();

   tags_update();

  return TRUE;

  }

  这个函数就调用一大堆的 缓存函数来天生缓存的。

  结束第一个函数 cache_common

  大众可以看下面的注释,是将 前缀名_model,前缀名_category ,前缀名_ module,前缀名,前缀名_type,前缀名_area,等等写入到$CACHE数组的对应下表之中 (歧model 表的数据$CACHE["model"]=$arr,$arr为phpcms_model表的数据)

  function cache_common()

  {

  global $db;

  $data = array();

  $result = $db->query("SELECT `module`,`name`,`path`,`url`,`iscore`,`version` FROM `".DB_PRE."module` WHERE `disabled`=0");

  while($r = $db->fetch_array($result))

  {

  if(!$r['path']) $r['path'] = $r['module'] == 'phpcms' ? '' : $r['module'].'/';

  if(!$r['url']) $r['url'] = $r['module'] == 'phpcms' ? '' : $r['module'].'/';

   $data[$r['module']] = $r;

  }

   $db->free_result($result);

  $CACHE['MODULE'] = $data;

   //以上是将对应的模块写入$CACHE;

  $data = array();

  $result = $db->query("SELECT * FROM `".DB_PRE."model` WHERE `disabled`=0");

   while($r = $db->fetch_array($result))

  {

   $data[$r['modelid']] = $r;

  }

   $db->free_result($result);

  $CACHE['MODEL'] = $data;

   $data = array();

  //以上是对应的 model表里的内容写入数组$CACHE;

   $result = $db->query("SELECT `catid`,`module`,`type`,`modelid`,`catname`,`style `,`image`,`catdir`,`url`,`parentid`,`arrparentid`,` parentdir`,`child`,`arrchildid`,`items`,`citems`,`p items`,`ismenu`,`letter` FROM `".DB_PRE."category` WHERE 1 ORDER BY `listorder`,`catid`");

  while($r = $db->fetch_array($result))

  {

  $r['url'] = url($r['url']);

  $data[$r['catid']] = $r;

  }

   $db->free_result($result);

  $CACHE['CATEGORY'] = $data;

   //以上是将总共的栏目写入$CACHE数组

  $data = array();

  $result = $db->query("SELECT `typeid`,`modelid`,`module`,`name`,`style`,`typedi r`,`url` FROM `".DB_PRE."type` WHERE 1 ORDER BY `listorder`,`typeid`");

  while($r = $db->fetch_array($result))

  {

   $data[$r['typeid']] = $r;

  }

   $db->free_result($result);

  $CACHE['TYPE'] = $data;

   //以上是将总共的 种别表里的数据写入$CACHE

  $data = array();

  $result = $db->query("SELECT `areaid`,`name`,`style`,`parentid`,`arrparentid`,` child`,`arrchildid` FROM `".DB_PRE."area` WHERE 1 ORDER BY `listorder`,`areaid`");

   while($r = $db->fetch_array($result))

  {

   $data[$r['areaid']] = $r;

  }

   $db->free_result($result);

  $CACHE['AREA'] = $data;

   //总共的地区表写入$CACHE;

  $data = array();

  $result = $db->query("SELECT `urlruleid`,`urlrule` FROM `".DB_PRE."urlrule` WHERE 1 ORDER BY `urlruleid`");

  while($r = $db->fetch_array($result))

  {

   $data[$r['urlruleid']] = $r['urlrule'];

  }

   $db->free_result($result);

  $CACHE['URLRULE'] = $data;

   //将总共的url章程写入缓存

  $data = array();

  $r = $db->get_one("SELECT `setting` FROM `".DB_PRE."module` WHERE `module`='phpcms'");

  $setting = $r['setting'];

  eval("\$PHPCMS = $setting;");

   if($PHPCMS['siteurl'] =='') $PHPCMS['siteurl'] = SITE_URL;

  $CACHE['PHPCMS'] = $PHPCMS;

  //最后调用 cache_write要领将总共的数组写入common.php 位置/date/cache/common.php依据体例变量慧有所改动

   cache_write('common.php', $CACHE);

  return $CACHE;

  }

  phpcms表缓存的实现体式格式主要是:运用一个叫cache_table函 数$table是要缓存的表名,$fileds 是查询的字段名字,默以为 ' * ',$where sql语句中的where 子句,$order 排序, $isline是否打开字段缓存默以为不打开,倘使打开表字段缓存和表缓存将同时举行

  function cache_table($table, $fields = '*', $valfield = '', $where = '', $order = '', $iscacheline = 0, $number = 0)

  {

  global $db;

  $keyfield = $db->get_primary($table);

  $data = array();

   if($where) $where = " WHERE $where";

  if(!$order) $order = $keyfield;

  $limit = $number ? "LIMIT 0,$number" : '';

   $result = $db->query("SELECT $fields FROM `$table` $where ORDER BY $order $limit");

  $table = preg_replace("/^".DB_PRE."(.*)$/", "\\1", $table);

  while($r = $db->fetch_array($result))

   {

  if(isset($r['setting']) && !empty($r['setting']))

   {

  $setting = $r['setting'];

  eval("\$setting = $setting;");

  unset($r['setting']);

   if(is_array($setting)) $r = array_merge($r, $setting);

  }

   $key = $r[$keyfield];

  $value = $valfield ? $r[$valfield] : $r;

  $data[$key] = $value;

  if($iscacheline) cache_write($table.'_'.$key.'.php', $value); //表字段缓存

  }

   $db->free_result($result);

  cache_write($table.'.php', $data) ;// 表缓存

  }

  将数据数组写入对应的缓存文件,以上这个函数即是鉴识下常量 CACHE_PATH是否存在默认是data/cache的路径然后用file_put_contents 将缓存的数据写入到对应的cachefile中

  function cache_write($file, $array, $path = '')

  {

  if(!is_array($array)) return false;

   $array = "<?php\nreturn ".var_export($array, true).";\n?>";

   $cachefile = ($path ? $path : CACHE_PATH).$file;

  $strlen = file_put_contents($cachefile, $array);

  @chmod($cachefile, 0777);

  return $strlen;

  }

  至于其他的可以参照以上的要领举行增 加,大众可以察看看对应的cache.func.php

  //缓存模型表

  function cache_model()

  {

  cache_table(DB_PRE.'model', '*', '', '', 'modelid', 1);

  }

  //缓存分类表天生文件路径是../data /cachecategory_catid.php

  function cache_category()

  {

  cache_table(DB_PRE.'category', '*', '', '', 'listorder,catid', 1);

  }

  缓存种别表天生路径

   ../data/cache/type_typeid.php

  function cache_type()

   {

  cache_table(DB_PRE.'type', '*', '', '', 'listorder,typeid', 1);

  }

  //缓存地区列表

  天生路径:../data/cache /area_areaid.php

  function cache_area()

  {

  cache_table(DB_PRE.'area', '*', '', '', 'listorder,areaid', 1);

  }

  //缓存用户组表

   //天生路径:../data/cache member_grounp_group_id.php

  function cache_member_group()

  {

  cache_table(DB_PRE.'member_group', '*', '', '', 'groupid', 1);

  cache_table(DB_PRE.'member_group', '*', 'name', '', 'groupid', 0);

  }

  //缓存角色表

   //天生路径:../data/cache/role_roleid.php

  function cache_role()

   {

  cache_table(DB_PRE.'role', '*', 'name', '', 'listorder,roleid');

  }

  //缓存作者表

  //天生路径:.. /data/cache/author_authorid.php

  function cache_author()

   {

  cache_table(DB_PRE.'author', '*', 'name', '', 'listorder,authorid', 0, 100);

  }

  function cache_keyword()

  {

  cache_table(DB_PRE.'keyword', '*', 'tag', '', 'listorder,usetimes', 0, 100);

  }

   function cache_copyfrom()

  {

  cache_table(DB_PRE.'copyfrom', '*', '', '', 'listorder,usetimes', 0, 100);

  }

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多