当前位置:首页 > CMS教程 > phpcms > 列表

【phpcms-v9】phpcms-v9的缓存结构

发布:smiling 来源: PHP粉丝网  添加日期:2014-10-23 16:19:01 浏览: 评论:0 

这篇文章继续介绍phpcms的缓存结构,我并没有做深入的学习,但是phpcms的想法上却是有他的过人之处,太令人折服了,这里分享phpcms缓存的一中实现方案.

/include/cache.func.php

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

最开始有一个函数:

  1. function cache_all() 
  2. { 
  3. @set_time_limit(600); 
  4. cache_common(); 
  5. cache_module(); 
  6. cache_model(); 
  7. cache_category(); 
  8. cache_area(); 
  9. cache_type(); 
  10. cache_member_group(); 
  11.     cache_role(); 
  12. cache_author(); 
  13. cache_keyword(); 
  14. cache_copyfrom(); 
  15. cache_pos(); 
  16.     cache_status(); 
  17. cache_workflow(); 
  18. tags_update(); 
  19. return TRUE; 
  20. } 

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

首先第一个函数 cache_common

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

  1. function cache_common() 
  2. { 
  3. global $db; 
  4. $data = array(); 
  5. $result = $db->query("SELECT `module`,`name`,`path`,`url`,`iscore`,`version` FROM `".DB_PRE."module` WHERE `disabled`=0"); 
  6. while($r = $db->fetch_array($result)) 
  7. { 
  8.    if(!$r['path']) $r['path'] = $r['module'] == 'phpcms' ? '' : $r['module'].'/'; 
  9.    if(!$r['url']) $r['url'] = $r['module'] == 'phpcms' ? '' : $r['module'].'/'; 
  10.    $data[$r['module']] = $r; 
  11. } 
  12.  
  13. $db->free_result($result); 
  14. $CACHE['MODULE'] = $data; 
  15. //以上是将对应的模块写入$CACHE; 
  16.  
  17. $data = array(); 
  18. $result = $db->query("SELECT * FROM `".DB_PRE."model` WHERE `disabled`=0"); 
  19. while($r = $db->fetch_array($result)) 
  20. { 
  21.    $data[$r['modelid']] = $r; 
  22. } 
  23. $db->free_result($result); 
  24. $CACHE['MODEL'] = $data; 
  25. $data = array(); 
  26.  
  27. //以上是对应的 model表里的内容写入数组$CACHE; 
  28.  
  29.  
  30. $result = $db->query("SELECT `catid`,`module`,`type`,`modelid`,`catname`,`style`,`image`,`catdir`,`url`,`parentid`,`arrparentid`,`parentdir`,`child`,`arrchildid`,`items`,`citems`,`pitems`,`ismenu`,`letter` FROM `".DB_PRE."category` WHERE 1 ORDER BY `listorder`,`catid`"); 
  31. while($r = $db->fetch_array($result)) 
  32. { 
  33.    $r['url'] = url($r['url']); 
  34.    $data[$r['catid']] = $r; 
  35. } 
  36. $db->free_result($result); 
  37. $CACHE['CATEGORY'] = $data; 
  38. //以上是将所有的栏目写入$CACHE数组 
  39.  
  40. $data = array(); 
  41. $result = $db->query("SELECT `typeid`,`modelid`,`module`,`name`,`style`,`typedir`,`url` FROM `".DB_PRE."type` WHERE 1 ORDER BY `listorder`,`typeid`"); 
  42. while($r = $db->fetch_array($result)) 
  43. { 
  44.    $data[$r['typeid']] = $r; 
  45. } 
  46. $db->free_result($result); 
  47. $CACHE['TYPE'] = $data; 
  48. //以上是将所有的 类别表里的数据写入$CACHE 
  49.  
  50. $data = array(); 
  51. $result = $db->query("SELECT `areaid`,`name`,`style`,`parentid`,`arrparentid`,`child`,`arrchildid` FROM `".DB_PRE."area` WHERE 1 ORDER BY `listorder`,`areaid`"); 
  52. while($r = $db->fetch_array($result)) 
  53. { 
  54.    $data[$r['areaid']] = $r; 
  55. } 
  56. $db->free_result($result); 
  57. $CACHE['AREA'] = $data; 
  58.  
  59. //所有的地区表写入$CACHE; 
  60.  
  61. $data = array(); 
  62. $result = $db->query("SELECT `urlruleid`,`urlrule` FROM `".DB_PRE."urlrule` WHERE 1 ORDER BY `urlruleid`"); 
  63. while($r = $db->fetch_array($result)) 
  64. { 
  65.    $data[$r['urlruleid']] = $r['urlrule']; 
  66. } 
  67. $db->free_result($result); 
  68. $CACHE['URLRULE'] = $data; 
  69.  
  70. //将所有的url规则写入缓存 
  71.  
  72. $data = array(); 
  73.     $r = $db->get_one("SELECT `setting` FROM `".DB_PRE."module` WHERE `module`='phpcms'"); 
  74. $setting = $r['setting']; 
  75. eval("\$PHPCMS = $setting;"); 
  76. if($PHPCMS['siteurl'] =='') $PHPCMS['siteurl'] = SITE_URL; 
  77.  
  78. $CACHE['PHPCMS'] = $PHPCMS; 
  79. //开源软件:phpfensi.com 
  80. //最后调用cache_write方法将所有的数组写入common.php 位置/date/cache/common.php根据系统变量慧有所改动 
  81.  
  82. cache_write('common.php', $CACHE); 
  83.      
  84. return $CACHE; 
  85. } 

phpcms表缓存的实现方式主要是:利用一个叫cache_table函数$table是要缓存的表名,$fileds 是查询的字段名字,默认为 ' * ',$where sql语句中的where 子句,$order 排序,$isline是否开启字段缓存默认为不开启,如果开启表字段缓存和表缓存将同时进行:

  1. function cache_table($table, $fields = '*', $valfield = '', $where = '', $order = '', $iscacheline = 0, $number = 0) 
  2. { 
  3. global $db; 
  4. $keyfield = $db->get_primary($table); 
  5. $data = array(); 
  6. if($where) $where = " WHERE $where"; 
  7. if(!$order) $order = $keyfield; 
  8. $limit = $number ? "LIMIT 0,$number" : ''; 
  9. $result = $db->query("SELECT $fields FROM `$table` $where ORDER BY $order $limit"); 
  10. $table = preg_replace("/^".DB_PRE."(.*)$/", "", $table); 
  11. while($r = $db->fetch_array($result)) 
  12. { 
  13.    if(isset($r['setting']) && !emptyempty($r['setting'])) 
  14.    { 
  15.     $setting = $r['setting']; 
  16.     eval("\$setting = $setting;");  
  17.     unset($r['setting']); 
  18.     if(is_array($setting)) $r = array_merge($r, $setting); 
  19.         } 
  20.    $key = $r[$keyfield]; 
  21.    $value = $valfield ? $r[$valfield] : $r; 
  22.    $data[$key] = $value; 
  23.    if($iscacheline) cache_write($table.'_'.$key.'.php', $value); //表字段缓存 
  24. } 
  25. $db->free_result($result); 
  26. cache_write($table.'.php', $data) ;// 表缓存 
  27.  
  28. } 

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

  1. function cache_write($file, $array, $path = '') 
  2. { 
  3. if(!is_array($array)) return false; 
  4. $array = "<?php\nreturn ".var_export($array, true).";\n?>"; 
  5. $cachefile = ($path ? $path : CACHE_PATH).$file; 
  6. $strlen = file_put_contents($cachefile, $array); 
  7. @chmod($cachefile, 0777); 
  8.  
  9. return $strlen; 
  10. } 

至于其他的可以参照以上的方法进行添加,大家可以查查看对应的cache.func.php:

  1. //缓存模型表 
  2. function cache_model() 
  3. { 
  4. cache_table(DB_PRE.'model', '*', '', '', 'modelid', 1); 
  5. } 
  6. //缓存分类表生成文件路径是../data/cachecategory_catid.php 
  7. function cache_category() 
  8. { 
  9. cache_table(DB_PRE.'category', '*', '', '', 'listorder,catid', 1); 
  10. } 
  11. 缓存类别表生成路径 
  12. ../data/cache/type_typeid.php 
  13. function cache_type() 
  14. { 
  15. cache_table(DB_PRE.'type', '*', '', '', 'listorder,typeid', 1); 
  16. } 
  17. //缓存地区列表 
  18. 生成路径:../data/cache/area_areaid.php 
  19. function cache_area() 
  20. { 
  21. cache_table(DB_PRE.'area', '*', '', '', 'listorder,areaid', 1); 
  22. } 
  23. //缓存用户组表 
  24. //生成路径:../data/cache member_grounp_group_id.php 
  25. function cache_member_group() 
  26. { 
  27. cache_table(DB_PRE.'member_group', '*', '', '', 'groupid', 1); 
  28. cache_table(DB_PRE.'member_group', '*', 'name', '', 'groupid', 0); 
  29. } 
  30. //缓存角色表 
  31. //生成路径:../data/cache/role_roleid.php 
  32. function cache_role() 
  33. { 
  34. cache_table(DB_PRE.'role', '*', 'name', '', 'listorder,roleid'); 
  35. } 
  36. //缓存作者表 
  37. //生成路径:../data/cache/author_authorid.php 
  38. function cache_author() 
  39. { 
  40. cache_table(DB_PRE.'author', '*', 'name', '', 'listorder,authorid', 0, 100); 
  41. } 
  42. function cache_keyword() 
  43. { 
  44. cache_table(DB_PRE.'keyword', '*', 'tag', '', 'listorder,usetimes', 0, 100); 
  45. } 
  46. function cache_copyfrom() 
  47. { 
  48. cache_table(DB_PRE.'copyfrom', '*', '', '', 'listorder,usetimes', 0, 100); 
  49. } 
  50. function cache_pos() 
  51. { 
  52. cache_table(DB_PRE.'position', '*', 'name', '', 'listorder,posid', 0); 
  53. }

Tags: phpcms缓存结构 phpcms缓存技术

分享到: