### [phpcms v9缓存文件是怎样生成的](https://www.prosaas.cn/article/5363) **Published:** 2020-01-14T01:53:01 **Author:** 5201314 **Excerpt:** phpcms v9缓存文件是怎样生成的?这篇文章介绍phpcms的缓存结构我并没有做深入的学习,但是phpcm… **![](//zhiqipro.oss-cn-beijing.aliyuncs.com/2023/12/20231212123929948.jpg)** **phpcms v9缓存文件是怎样生成的?** 这篇文章介绍phpcms的缓存结构 我并没有做深入的学习,但是phpcms的想法上却是有他的过人之处,太令人折服了,这里分享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\`,\`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 = ""; $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缓存文件是怎样生成的的详细内容,更多请关注知企PROSAAS其它相关文章! **Tags:** include, php, PHPCMS, sql, table, 堆, 常量 **Categories:** PHPCMS ---