phpcms v9缓存文件是怎样生成的?
这篇文章介绍phpcms的缓存结构
我并没有做深入的学习,但是phpcms的想法上却是有他的过人之处,太令人折服了,这里分享phpcms缓存的一中实现方案
/include/cache.func.php
这里最先主要是定义了一些phpcms的缓存函数,phpcms的缓存分为,表缓存,模型缓存,模型字段缓存,还有模块缓存,首先这些都是基于表的缓存的。
立即学习“PHP免费学习笔记(深入)”;
最开始有一个函数
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`,`pitems`,`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`,`typedir`,`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."(.*)$/", "", $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 return ".var_export($array, true)."; ?>"; $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); } function cache_pos() { cache_table(DB_PRE.'position', '*', 'name', '', 'listorder,posid', 0); }登录后复制
PHP中文网,大量的免费PHPCMS教程,欢迎在线学习!
以上就是phpcms v9缓存文件是怎样生成的的详细内容,更多请关注慧达安全导航其它相关文章!
免责 声明
1、本网站名称:慧达安全导航
2、本站永久网址:https//www.huida178.com/
3、本站所有资源来源于网友投稿和高价购买,所有资源仅对编程人员及源代码爱好者开放下载做参考和研究及学习,本站不提供任何技术服务!
4、本站所有资源的属示图片和信息不代表本站的立场!本站只是储蓄平台及搬运
5、下载者禁止在服务器和虚拟机下进行搭建运营,本站所有资源不支持联网运行!只允许调试,参考和研究!!!!
6、未经原版权作者许可禁止用于任何商业环境,任何人不得擅作它用,下载者不得用于违反国家法律,否则发生的一切法律后果自行承担!
7、为尊重作者版权,请在下载24小时内删除!请购买原版授权作品,支持你喜欢的作者,谢谢!
8.若资源侵犯了您的合法权益,请持 您的版权证书和相关原作品信息来信通知我们!QQ:1247526623我们会及时删除,给您带来的不便,我们深表歉意!
9、如下载链接失效、广告或者压缩包问题请联系站长处理
10、如果你也有好源码或者教程,可以发布到网站,分享有金币奖励和额外收入!
11、本站资源售价只是赞助,收取费用仅维持本站的日常运营所需
12、因源码具有可复制性,一经赞助,不得以任何形式退款。
13、本文内容由网友自发贡献和站长收集,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系1247526623@qq.com
转载请注明出处: 慧达安全导航 » phpcms v9缓存文件是怎样生成的
发表评论 取消回复