PHPCMS2008源码浅析-cache.func.php PHPCMS20008二次开发

<?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;
}

function cache_common()
{
global $db;
$data = array();
$result = $db->query("SELECT `module`,`name`,`path`,`url`,`iscore`,`version` FROM `".DB_PRE."module` WHERE `disabled`=0");
//取出模块表中的基本数据,module 为module的英文名,name为中文名,path为它的所在目录,url和path数据一样子,也是表示目录,iscore判断是否为内置核心模块,version为版本号

while($r = $db->fetch_array($result))
{
   if(!$r['path']) $r['path'] = $r['module'] == 'phpcms' ? '' : $r['module'].'/'; //设置模块当没有指定路径时,指向phpcms
   if(!$r['url']) $r['url'] = $r['module'] == 'phpcms' ? '' : $r['module'].'/';    // //设置模块当没有指定路径时,指向url
   $data[$r['module']] = $r;//value=array $r
}
$db->free_result($result);
$CACHE['MODULE'] = $data;   //给值给cahe的module变量,值包含path,url此外应该为 所有模块 path/url
$data = array();
$result = $db->query("SELECT * FROM `".DB_PRE."model` WHERE `disabled`=0"); //加载内容模版`disabled`=0", 意思为没有设置关闭的 model表如下
//No. 字段 类型 Null Key 默认值|说明
//1 modelid tinyint(3) unsigned NO PRI | 模型ID auto_increment
//2 name varchar(30) NO | 模型名称
//3 description varchar(255) NO | 描述
//4 tablename varchar(20) NO | 保存表名
//5 itemname varchar(10) NO | 项目名称
//6 itemunit varchar(10) NO | 项目单位
//7 workflowid tinyint(3) unsigned NO 0 | 工作流方案
//8 template_category varchar(30) NO | 栏目首页模板
//9 template_list varchar(30) NO | 栏目列表页模板
//10 template_show varchar(30) NO | 内容页模板
//11 template_print varchar(30) NO | 打印页模板
//12 ishtml tinyint(1) unsigned NO 0 | 是否生成html
//13 category_urlruleid tinyint(1) unsigned NO 0 | 栏目URL规则
//14 show_urlruleid tinyint(1) unsigned NO 0 | 内容页URL规则
//15 enablesearch tinyint(1) unsigned NO 1 |
//16 ischeck tinyint(1) unsigned NO 1 |
//17 isrelated tinyint(1) unsigned NO 1 |
//18 disabled tinyint(1) unsigned NO 0 | 禁用
//19 modeltype tinyint(1) unsigned NO 0 | 类型

while($r = $db->fetch_array($result))
{
   $data[$r['modelid']] = $r; //取所有的model_Id
}
$db->free_result($result);
$CACHE['MODEL'] = $data;     //给cache变量
$data = array();
$result = $db->query("SELECT `catid`,`module`,`type`,`modelid`,`catname`,`style`,`image`,`catdir`,`url`,`parentid`,`arrparentid`,`parentdir`,`child`,`arrchildid`,`items`,`ismenu` FROM `".DB_PRE."category` WHERE 1 ORDER BY `listorder`,`catid`");
//自己可以在机器上,跑一下如上sql语句,结果是
//cartoary 表结构 字段 类型 Null Key 默认值|说明
//1 catid smallint(5) unsigned NO PRI | 栏目ID auto_increment
//2 module varchar(15) NO MUL | 模块
//3 type tinyint(1) unsigned NO 0 | 栏目类型
//4 modelid tinyint(3) unsigned NO 0 | 模型ID
//5 parentid smallint(5) unsigned NO 0 | 上级栏目ID
//6 arrparentid varchar(255) NO | 所有上级栏目ID
//7 child tinyint(1) unsigned NO 0 | 是否有子栏目
//8 arrchildid mediumtext NO | 所有子栏目ID
//9 catname varchar(30) NO | 栏目名称
//10 style varchar(5) NO | 样式
//11 image varchar(100) NO | 栏目图片
//12 description mediumtext NO | 描述
//13 parentdir varchar(100) NO | 父目录
//14 catdir varchar(30) NO | 栏目目录
//15 url varchar(100) NO | 链接
//16 content mediumtext NO | 单网页内容
//17 items mediumint(8) unsigned NO 0 | 信息数
//18 hits int(10) unsigned NO 0 | 点击数
//19 setting mediumtext NO | 设置
//20 listorder smallint(5) unsigned NO 0 | 排序
//21 ismenu tinyint(1) unsigned NO 1 | 在导航显示
//也就是生成了目录树

while($r = $db->fetch_array($result))
{
   $r['url'] = url($r['url']); // url varchar(100) NO | 链接 如生成后,显示为 /module_目录/index.html
   $data[$r['catid']] = $r;    //目录id,这些在形成首页head里的那个导行非常有用,我测试了下就是从这里调用的数据,如果导航数据有错,可以调整这里
}
$db->free_result($result);
$CACHE['CATEGORY'] = $data;    //给cache变量,方便以后调用
$data = array();
$result = $db->query("SELECT `typeid`,`module`,`name`,`style`,`typedir`,`url` FROM `".DB_PRE."type` WHERE 1 ORDER BY `listorder`,`typeid`");
   //      1 link 默认分类      
    // 2 error_report 错字      
    // 3 error_report 无效URL   
    // 0 好像为内部栏目类别

while($r = $db->fetch_array($result))
{
   $data[$r['typeid']] = $r;
}
$db->free_result($result);
$CACHE['TYPE'] = $data;
$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;    
$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;     //module的url规则 2008默认为it/product/2006/1010/1_2.html格式
$data = array();
    $r = $db->get_one("SELECT `setting` FROM `".DB_PRE."module` WHERE `module`='phpcms'");
//SQL查出来,如下数据,这是网站配置的基本信息,在后台可以设置,写到这个表里
//------------------------------------------------------------------------
$setting = $r['setting'];
eval("/$PHPCMS = $setting;");
if($PHPCMS['siteurl'] =='') $PHPCMS['siteurl'] = SITE_URL;   // 'siteurl' => 'http://127.0.0.1/phpcms/',
$CACHE['PHPCMS'] = $PHPCMS;    
cache_write('common.php', $CACHE);          //将上面生成的 $CACHE变量,写到common.php中,也就是形成了data/cache/common.php
    return $CACHE;
}

 

function cache_module()
{
//此函数的目的,是生成单独页的配置信息,把前面setting关于的一些网站基本信息,与 模块的信息组成一个新的数组,并写到 /dada/cache/module_xxx.php
global $db;
$data = array();
$result = $db->query("SELECT `module`,`name`,`path`,`url`,`iscore`,`version`,`publishdate`,`installdate`,`updatedate`,`setting` 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'])   //当url为空值时,给module值给它,从数据库来看,这两个值通常是一样子的
   {
    $r['url'] = $r['module'] == 'phpcms' ? '' : $r['module'].'/';
    $db->query("UPDATE `".DB_PRE."module` SET `url`='$r[url]' WHERE module='$r[module]' LIMIT 1");
   }

   if($r['setting'])
   {
    $setting = $r['setting'];
    eval("/$setting = $setting;");   //将setting重新给一个数据变量
    unset($r['setting']);           //清空数组r里的setting变量,
    if(is_array($setting)) $r = array_merge($r, $setting);
    //这一句要注意,把setting数组合并$r模块里的关于`module`,`name`,`path`,`url`,`iscore`,`version`,`publishdate`,`installdate`,`updatedate`信息,方便后面调用
        }
   cache_write('module_'.$r['module'].'.php', $r);   //生成 module_xxx.php,这里跑完这一句后,就生成了,最新的模块配置的信息,里面是最基础的数据并没有网站内容
}
$db->free_result($result);
}

function cache_model() //生成模形数据
{
cache_table(DB_PRE.'model', '*', '', '', 'modelid', 1);
}

function cache_category() //生成目录数据
{
cache_table(DB_PRE.'category', '*', '', '', 'listorder,catid', 1);
}

function cache_type()   //生成栏目类别数据
{
cache_table(DB_PRE.'type', '*', '', '', 'listorder,typeid', 1);
}

function cache_area() //生成地区数据
{
cache_table(DB_PRE.'area', '*', '', '', 'listorder,areaid', 1);
}

function cache_member_group() //生成用户权限组数据
{
cache_table(DB_PRE.'member_group', '*', '', '', 'groupid', 1);
cache_table(DB_PRE.'member_group', '*', 'name', '', 'groupid', 0);
}

function cache_role()     //生成用户角色数据 如admin,栏目编辑等
{
cache_table(DB_PRE.'role', '*', 'name', '', 'listorder,roleid');
}

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);
}

function cache_status() //状态数据
{
global $db;
$array = array();
$result = $db->query("SELECT * FROM `".DB_PRE."status` ORDER BY `status` ASC");
while($r = $db->fetch_array($result))
{
   $array[$r['status']] = $r['name'];
}
cache_write('status.php', $array);
return $array;
}

function cache_workflow() //工作流
{
global $db;
$array = array();
$result = $db->query("SELECT * FROM `".DB_PRE."workflow` ORDER BY `workflowid` ASC");
while($r = $db->fetch_array($result))
{
   $array[$r['workflowid']] = $r['name'];
}
cache_write('workflow.php', $array);
return $array;
}

function cache_formguid()
{
cache_table(DB_PRE.'formguide', '*', '', '', 0);
}
//生成表的cache文件函数
//本函数会将数据库中,按主键ID生成数据表的cache文件,典型例子是 /data/cache/下category_*.php 的文件
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;     //设置order顺序
$limit = $number ? "LIMIT 0,$number" : '';    //设置跑多少条数
$result = $db->query("SELECT $fields FROM `$table` $where ORDER BY $order $limit"); //sql
$table = preg_replace("/^".DB_PRE."(.*)$/", "//1", $table); //取table名去掉了表前缀
while($r = $db->fetch_array($result))  
{
   if(isset($r['setting']) && !empty($r['setting']))    //因为 一行数据中 setting是一个数组,所以要把它另拿出来,作为变量再与前面的merge
   {
    $setting = $r['setting'];
    eval("/$setting = $setting;");
    unset($r['setting']);
    if(is_array($setting)) $r = array_merge($r, $setting);   //merge两个组组
        }
   $key = $r[$keyfield];
   $value = $valfield ? $r[$valfield] : $r;
   $data[$key] = $value;
   if($iscacheline) cache_write($table.'_'.$key.'.php', $value);   //生成cache文件,格式为 表名_主键id.php $iscacheline=1表示生成cache否则不开启
}
$db->free_result($result);
cache_write($table.'.php', $data);   //生成表的全部数据   如/data/caceh/category.php 可以看一下数据结构就会明白了
}

?>

Phpcms2008产品介绍 Phpcms是一个基于PHP+Mysql架构的网站内容管理系统,同时也是一个开放的PHP开发平台。Phpcms采用模块化方式开发,功能强大灵活易于扩展,并且完全开放源代码,面向大中型站点提供重量级网站建设解决方案。3年来,凭借Phpcms团队长期积累的丰富的Web开发及数据库经验和勇于创新追求完美的设计理念,使得Phpcms得到了近10万网站的认可,并且越来越多地被应用到大中型商业网站。 主要特性: 1、功能强大,内置近20个功能模块 Phpcms2008由内容模型、会员模型、问吧、专题、全站搜索、个人空间、广告、订单、财务、投票调查、短消息、邮件订阅、Digg、心情指数、评论、友情链接、公告、留言板等近20多个功能模块组成。 2、模块化,开源,可扩展 Phpcms采用模块化方式开发,提供统一的模块开发接口和底层平台支持,并且完全开源,便于二次开发Phpcms2008采用面向对象方式开发,代码更易于阅读和维护,代码质量大幅提升。 3、负载能力强,支持千万级数据 Phpcms团队基于3年的开发经验和不断总结,从缓存技术、数据库设计、代码优化等多个角度入手进行优化,内容可文本存储,让信息和会员数据量支持达到了千万级。 4、权限控制更完美 Phpcms2008后台通过角色进行权限控制,可按模块、栏目、菜单、字段、推荐位、碎片、自由调用、审核流程等设置角色权限,并支持同一个管理员继承多个角色的权限,这让多人维护的站点权限控制变得轻松自如。支持自定义稿件状态和工作流,可自由定义多级稿件审核机制,更适合大中型网站或者单位内网协同工作。 5、模板制作方便,支持中文标签、万能自由标签和碎片功能 Phpcms2008采用MVC设计模式实现了程序与模板分离,不仅继续支持{tag_焦点新闻}格式的中文标签,还支持万能自由标签,轻松调用Phpcms之外的数据库信息,比如论坛、博客、商城。碎片功能融合了2007版里的自由调用和自定义标签功能,并且可以有效地和首页、栏目、专题等进行结合,支持后台可视化编辑和预览。 6、前后台模板设计精美,用户体验好 Phpcms2008前台、后台、会员中心界面全新设计,模板采用DIV+CSS,引入jquery框架,广泛应用AJAX无刷新技术,并且兼容IE和Firefox浏览器,访问速度快。新的后台界面非常漂亮,支持自定义无限极树形菜单,并且采用AJAX加载。 7、支持推荐位功能,内容推送更方便 大中型站点的网站首页、频道首页、专题页的内容都是编辑精心挑选推荐的,可见内容的精确定位推送非常重要。Phpcms的推荐位功能则可以让指定的编辑把信息精确推送到多个指定的位置,也可以随时撤下来。 8、支持生成Html和PHP动态访问,支持内容访问权限控制和收费 可按内容模型自由设置是否生成html,如果不生成html,就可以自由设置内容访问权限和收费,配合强大的财务功能,提供了高效的商业收费网站解决方案。 9、支持自定义内容模型 Phpcms2008支持自定义内容模型,按内容模型自定义字段,并且按字段自定义标签调用条件和信息搜索条件,按栏目绑定内容模型。 Phpcms2008内置了文章、图片、下载、信息四个常用内容模型,并且用户可以根据自身需求自定义内容模型。 10、支持自定义会员模型 Phpcms2008支持自定义会员模型,按会员模型自定义字段,并且按字段自定义标签调用条件和会员搜索条件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值