📄 cache.func.php
字号:
<?
/**
* 缓存处理 版本 v1.0.0
* all rights reserved by tech of ZOL
* last modified time:2008-4-12
*/
/**
* 数组内容格式处理
* @param $array 要处理的数组
* @param $level 数组的更新级别
*/
function arrayeval($array, $level = 0) {
$space = '';
for($i = 0; $i <= $level; $i++) {
$space .= "\t";
}
$evaluate = "Array\n$space(\n";
$comma = $space;
foreach($array as $key => $val) {
$key = is_string($key) ? '\''.addcslashes($key, '\'\\').'\'' : $key;
$val = !is_array($val) && (!preg_match("/^\-?[1-9]\d*$/", $val) || strlen($val) > 12) ? '\''.addcslashes($val, '\'\\').'\'' : $val;
if(is_array($val)) {
$evaluate .= "$comma$key => ".arrayeval($val, $level + 1);
} else {
$evaluate .= "$comma$key => $val";
}
$comma = ",\n$space";
}
$evaluate .= "\n$space)";
return $evaluate;
}
/**
* 获得缓存的数据
* @param $cachename 缓存名称
*/
function get_cache_array($cachename){
global $db_power,$db_doc,$db_comment,$db_sub_plugin,$db_pro;
$cols = '*'; //默认查询全部字段
$conditions = '';
switch ($cachename) {
case 'class': //文章大类
$table = 'document_class'; //要调用的表名
$db = $db_doc; //数据连接
$cols = 'classid,classname'; //要查询的字段
$conditions = "where 1 and status=0"; //查询条件
break;
case 'allclass': //所有大类
$table = 'document_class';
$db = $db_doc;
$cols = 'classid,classname,url,hostname,directory';
$conditions = "where 1 and status=0";
break;
case 'subclass': //文章子类
$table = 'document_subclass';
$db = $db_doc;
$cols = 'subclassid,subclassname,classid';
$conditions = "where 1 and status=0";
break;
case 'grandclass': //文章子子类
$table = 'document_grandclass';
$db = $db_doc;
$cols = 'grandclassid,grandclassname,subclassid';
$conditions = "where 1 and status=0";
break;
case 'cate': //产品大类
$table = 'category';
$db = $db_pro;
$cols = 'id,name';
$conditions = "WHERE property=0 ORDER BY id";
break;
case 'subcate': //产品子类
$table = 'subcategory s LEFT JOIN category c on s.categoryid=c.id';
$db = $db_pro;
$cols = 's.id,s.name,s.categoryid';
$conditions = "WHERE c.property=0 ORDER BY s.order_sort DESC";
break;
case 'merchant': //产品品牌
$table = 'manufacturer m LEFT JOIN manu_product p ON m.id=p.manuid
LEFT JOIN subcategory s ON p.subcatid=s.id
LEFT JOIN category c on s.categoryid=c.id';
$db = $db_pro;
$cols = 'DISTINCT m.id AS id,m.name AS name,p.subcatid';
$conditions = "WHERE c.property=0 ORDER BY m.name";
break;
case 'merchant_red': //产品品牌标红
$table = 'pro_hits';
$db = $db_pro;
$cols = 'manu_id,sum(ip_count) hits,subcat_id';
$conditions = "WHERE the_date>date_sub(now(),Interval 2 month)
GROUP BY subcat_id,manu_id ORDER BY hits DESC";
break;
case 'user': //用户基本信息
$table = 'user_info';
$db = $db_power;
$cols = 'userid,defaultmenu,menuids,realname,groupid';
$conditions = "where 1 and status=0";
break;
case 'menu_root': //根菜单
$table = 'menu';
$db = $db_power;
$cols = 'menuid,name,url';
$conditions = "where 1 and type=1 and rootid=0 and status=0";
break;
case 'menu_sub': //子菜单
$table = 'menu';
$db = $db_power;
$cols = 'menuid';
$conditions = "where 1 and type=1 and rootid=0 and status=0";
break;
case 'menu_action': //菜单的链接
$table = 'menu';
$db = $db_power;
$cols = 'menuid,url';
$conditions = "where 1 and rootid<>0";
break;
case 'menu_hidden': //隐藏的菜单
$table = 'menu';
$db = $db_power;
$cols = 'menuid';
$conditions = "where 1 and type=1 and rootid=0 and status=0";
break;
case 'menu_grand': //子子菜单
$table = 'menu';
$db = $db_power;
$cols = 'menuid';
$conditions = "where 1 and type=1 and rootid!=0 and status=0";
break;
case 'template': //所有模板
$table = 'template';
$db = $db_doc;
$cols = 'templateid,name,typeid';
$conditions = "where 1 and status=0";
break;
case 'temp_rela': //所有模板,按类别区分
$table = 'template';
$db = $db_doc;
$cols = 'templateid,name,typeid';
$conditions = "where 1 and status=0";
break;
case 'element': //模板元素
$table = 'template_element';
$db = $db_doc;
$cols = 'elementid,name,content';
$conditions = "where 1 and typeid=3 and status=0";
break;
case 'set_channel': //频道列表
$table = 'channel_info';
$db = $db_sub_plugin;
$cols = 'id,name';
$conditions = "where 1 and status=0";
break;
case 'keywords': //频道列表
$table = 'public_keyword';
$db = $db_doc;
$cols = 'keyword,kurl,classid';
$conditions = "where 1 and status=0 order by corder desc";
break;
case 'set_ad_channel': //频道列表
$table = 'ad_channel';
$db = $db_sub_plugin;
$cols = 'id,name';
$conditions = "where 1 and status=0";
break;
case 'set_ad_place': //频道列表
$table = 'ad_place';
$db = $db_sub_plugin;
$cols = 'id,name';
$conditions = "where 1 and status=0";
break;
case 'set_ad_group_channel': //频道广告位列表
$table = 'ad_channel';
$db = $db_sub_plugin;
$cols = 'id,name,groupid';
$conditions = "where 1 and status=0";
break;
case 'set_ad_channel_place': //频道列表
$table = 'ad_place,ad_channel';
$db = $db_sub_plugin;
$cols = 'ad_place.id,ad_place.name,ad_channel.id as channelid';
$conditions = "where 1 and ad_place.status=0 and ad_place.channel=ad_channel.id";
break;
case 'stat_channel': //访问量
$table = 'tb_channel';
$db = $db_sub_plugin;
$cols = 'channelid,channelname';
$conditions = "where 1 order by corder desc";
break;
default:
break;
}
//数据查询
$sql_str = "SELECT $cols FROM $table $conditions";
$data_res = $db -> get_results($sql_str,"O");
//数据处理
switch ($cachename) {
case 'class': //文章大类
if($data_res){ //获得的数据
foreach($data_res as $data){ //更新到相应数组中
$cachedata['class_arr'][$data->classid]=$data->classname;
}
}
break;
case 'allclass': //所有大类
if($data_res){
foreach($data_res as $data){
$cachedata['allclass_arr'][$data->classid]['classname']=$data->classname;
$cachedata['allclass_arr'][$data->classid]['url']=$data->url;
$cachedata['allclass_arr'][$data->classid]['hostname']=$data->hostname;
$cachedata['allclass_arr'][$data->classid]['directory']=$data->directory;
}
}
break;
case 'subclass': //文章子类
if($data_res){
foreach($data_res as $data){
$cachedata['subclass_arr'][$data->classid][$data->subclassid]=$data->subclassname;
}
}
break;
case 'grandclass': //文章子子类
if($data_res){
foreach($data_res as $data){
$cachedata['grandclass_arr'][$data->subclassid][$data->grandclassid]=$data->grandclassname;
}
}
break;
case 'cate': //产品大类
if ($data_res) {
foreach ($data_res as $data) {
$cachedata['cate_arr'][$data->id] = $data->name;
}
}
break;
case 'subcate': //产品大类
if ($data_res) {
foreach ($data_res as $data) {
$cachedata['subcate_arr'][$data->categoryid][$data->id] = $data->name;
}
}
break;
case 'merchant': //产品大类
if ($data_res) {
foreach ($data_res as $data) {
$cachedata['merchant_arr'][$data->subcatid][$data->id] = $data->name;
}
}
break;
case 'merchant_red': //产品大类
if ($data_res) {
foreach ($data_res as $data) {
$cachedata['merchant_red_arr'][$data->subcat_id][] = $data->manu_id;
}
}
break;
case 'user': //文章用户
if($data_res){
foreach($data_res as $data){
$cachedata[$cachename][$data->userid]['defaultmenu']=$data->defaultmenu;
$cachedata[$cachename][$data->userid]['menuids']=$data->menuids;
$cachedata[$cachename][$data->userid]['realname']=$data->realname;
$cachedata[$cachename][$data->userid]['usergroup']=$GLOBALS['settings']['user_group'][$data->groupid];
}
}
break;
case 'menu_root': //根菜单
if($data_res){
foreach($data_res as $data){
$cachedata[$cachename][$data->menuid]['name']=$data->name;
$cachedata[$cachename][$data->menuid]['action']=$data->url;
}
}
break;
case 'menu_sub': //子菜单
if($data_res){
foreach($data_res as $data){
$cachedata[$cachename][$data->menuid] = array();
//获得子菜单的信息
$sql_str = "select menuid,name from menu where rootid=".$data->menuid;
$db_power -> query($sql_str);
while ($db_power -> next_record()){
$cachedata[$cachename][$data->menuid][$db_power -> f("menuid")] = $db_power -> f("name");
}
}
}
break;
case 'menu_action': //菜单链接
if($data_res){
foreach($data_res as $data){
$cachedata[$cachename][$data->menuid]=$data->url;
}
}
break;
case 'menu_hidden': //隐藏的链接
if($data_res){
foreach($data_res as $data){
$cachedata[$cachename][$data->menuid] = array();
$sql_str = "select menuid from menu where rootid=".$data->menuid." and status=1";
$db_power -> query($sql_str);
while ($db_power -> next_record()){
$cachedata[$cachename][$data->menuid][] = $db_power -> f("menuid");
}
}
}
break;
case 'menu_grand': //子子菜单
if($data_res){
foreach($data_res as $data){
$sql_str = "select menuid,name from menu where rootid=".$data->menuid." and status=0";
$db_power -> query($sql_str);
while ($db_power -> next_record()){
$cachedata[$cachename][$data->menuid][$db_power -> f("menuid")] = $db_power -> f("name");
}
}
}
break;
case 'template': //模板
if($data_res){
foreach($data_res as $data){
$cachedata['temp_arr'][$data->templateid]=$data->name;
}
}
break;
case 'temp_rela': //模板,按类型
if($data_res){
foreach($data_res as $data){
$cachedata['temp_rela_arr'][$data->typeid][$data->templateid]=$data->name;
}
}
break;
case 'element': //公用元素
if($data_res){
foreach($data_res as $data){
$cachedata['elem_arr'][$data->elementid]['name']=$data->name;
$cachedata['elem_arr'][$data->elementid]['content']=$data->content;
}
}
break;
case 'set_channel': //频道列表
if($data_res){
foreach($data_res as $data){
$cachedata[$cachename][$data->id]=$data->name;
}
}
break;
case 'keywords': //频道列表
if($data_res){
foreach($data_res as $data){
$cachedata['keyword_arr'][$data->classid][$data->keyword]=$data->kurl;
}
}
break;
case 'set_ad_channel': //频道列表
if($data_res){
foreach($data_res as $data){
$cachedata[$cachename][$data->id]=$data->name;
}
}
break;
case 'set_ad_place': //频道列表
if($data_res){
foreach($data_res as $data){
$cachedata[$cachename][$data->id]=$data->name;
}
}
break;
case 'set_ad_group_channel': //频道列表
if($data_res){
foreach($data_res as $data){
$cachedata[$cachename][$data->groupid][$data->id]=$data->name;
}
}
break;
case 'stat_channel': //访问量
if($data_res){
foreach($data_res as $data){
$cachedata['stat_channel_arr'][$data->channelid]=$data->channelname;
}
}
break;
case 'set_ad_channel_place': //频道列表
if($data_res){
foreach($data_res as $data){
$cachedata[$cachename][$data->channelid][$data->id]=$data->name;
$cachedata['set_ad_place_channel'][$data->id]=$data->channelid;
}
}
break;
default:
break;
}
return getcachevars($cachedata);
}
/**
* 获得缓存的数据类型
*
* @param $data 要操作的数组
* @param $type 数据类型(变量还是常量)
*/
function getcachevars($data, $type = 'VAR') {
$evaluate = '';
if($data){
foreach($data as $key => $val) {
if(is_array($val)) {
$evaluate .= "\$$key = ".arrayeval($val).";\n";
} else {
$val = addcslashes($val, '\'\\');
$evaluate .= $type == 'VAR' ? "\$$key = '$val';\n" : "define('".strtoupper($key)."', '$val');\n";
}
}
}
return $evaluate;
}
/**
* 将缓存写入文件
* @param $cachename 缓存名称
* @param $cachedata 缓存数据
* @param $dir 缓存的文件夹
*/
function write_cache_tofile($cachename,$cachedata,$dir=''){
$dir = SYSTEM_ROOT."cachedata/".$dir;
if(!is_dir($dir)) {
@mkdir($dir, 0777);
}
if(@$fp = fopen($dir.$cachename.".cache.php", 'w')) {
fwrite($fp, "<?php\n//CMS cache file, DO NOT modify me!\n".
"//Created on ".date("M j, Y, G:i")."\n\n$cachedata?>");
fclose($fp);
}
}
/**
* 更新缓存
* @param $cachename 缓存名称
*/
function update_cache($cachename){
//设定相应的缓存数组
$cachescript = array(
'user' => array('user'),
'doc' => array('class','subclass','grandclass','allclass'),
'product' => array('cate','subcate','merchant','merchant_red'),
'menu' => array('menu_root','menu_sub','menu_action','menu_hidden','menu_grand'),
'template' => array('template','temp_rela'),
'link' => array('set_channel'),
'ad' => array('set_ad_channel','set_ad_place','set_ad_group_channel','set_ad_channel_place'),
'webstat' => array('stat_channel'),
'keywords' => array('keywords'),
'element' => array('element')
);
//单独更新缓存
if($cachename){
foreach ($cachescript[$cachename] as $cachenames){
$cachedata .= get_cache_array($cachenames);
}
write_cache_tofile($cachename,$cachedata);
}
//留出批量更新接口
if(empty($cachename) && $execult_all=="Y"){
foreach($cachescript as $key=>$val){
$cachedata="";
foreach ($cachescript[$key] as $cachenames){
$cachedata .= get_cache_array($cachenames);
}
write_cache_tofile($key,$cachedata);
}
}
}
/**
* 初始缓存更新
* @param $cachename 缓存名称
*/
if($_REQUEST['update_cache_ALL']=="Y"){
update_cache("","Y");
echo "update all cache complate!";
}
?>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -