UCHome中缓存处理文件(function_cache.php)的代码分析
UCHome处理缓存的方式是通过文件的形式来存储文件,然后前台读取的是在服务器上的,这一文件写的就是一些关于uchome要缓存的一些信息,很多的内容都有重复,所以就删除了一小部分
01.
<?php
02.
/*
03.
[UCenter Home] (C) 2007-2008 Comsenz Inc.
04.
$Id: function_cache.php 2009-10-22 21:48:00
05.
@author ymaozi
06.
@copyright http://www.codedesign.cn/
07.
@uchome源码交流QQ群:83400263
08.
*/
09.
10.
if
(!defined(
'IN_UCHOME'
)) {
11.
exit
(
'Access Denied'
);
12.
}
13.
14.
/**
15.
* 更新配置文件
16.
* @param bool $updatedata
17.
*/
18.
function
config_cache(
$updatedata
=true) {
19.
global
$_SGLOBAL
;
20.
21.
$_SCONFIG
=
array
();
22.
$query
=
$_SGLOBAL
[
'db'
]->query(
'SELECT * FROM '
.tname(
'config'
));
//获取数据库中的配置文件信息
23.
while
(
$value
=
$_SGLOBAL
[
'db'
]->fetch_array(
$query
)) {
24.
if
(
$value
[
'var'
] ==
'privacy'
) {
25.
$value
[
'datavalue'
] =
empty
(
$value
[
'datavalue'
])?
array
():unserialize(
$value
[
'datavalue'
]);
26.
}
27.
$_SCONFIG
[
$value
[
'var'
]] =
$value
[
'datavalue'
];
//将数据库中配置数据存放到全局变量$_SCONFIG中
28.
}
29.
cache_write(
'config'
,
'_SCONFIG'
,
$_SCONFIG
);
//将缓存数据写入到缓存文件中
30.
31.
if
(
$updatedata
) {
32.
$setting
= data_get(
'setting'
);
//获取setting的配置数据
33.
$_SGLOBAL
[
'setting'
] =
empty
(
$setting
)?
array
():unserialize(
$setting
);
34.
//unserialize(),将序列化的字符串转换成数组
35.
cache_write(
'setting'
,
"_SGLOBAL['setting']"
,
$_SGLOBAL
[
'setting'
]);
36.
//将设置文件写入到缓存文件
37.
38.
$mail
= data_get(
'mail'
);
39.
$_SGLOBAL
[
'mail'
] =
empty
(
$mail
)?
array
():unserialize(
$mail
);
40.
cache_write(
'mail'
,
"_SGLOBAL['mail']"
,
$_SGLOBAL
[
'mail'
]);
41.
42.
$spam
= data_get(
'spam'
);
43.
$_SGLOBAL
[
'spam'
] =
empty
(
$spam
)?
array
():unserialize(
$spam
);
44.
cache_write(
'spam'
,
"_SGLOBAL['spam']"
,
$_SGLOBAL
[
'spam'
]);
45.
}
46.
}
001.
/**
002.
* 更新network配置文件
003.
* @param bool $updatedata
004.
*/
005.
function
network_cache() {
006.
global
$_SGLOBAL
,
$_SCONFIG
;
007.
008.
$setting
= data_get(
'network'
);
009.
$_SGLOBAL
[
'network'
] =
empty
(
$setting
)?
array
():unserialize(
$setting
);
010.
cache_write(
'network'
,
"_SGLOBAL['network']"
,
$_SGLOBAL
[
'network'
]);
011.
//写入缓存文件
012.
}
013.
014.
/**
015.
* 更新活动分类
016.
*/
017.
function
eventclass_cache(){
018.
global
$_SGLOBAL
;
019.
020.
$_SGLOBAL
[
'eventclass'
] =
array
();
021.
// 从数据库获取活动的分类
022.
$query
=
$_SGLOBAL
[
'db'
]->query(
"SELECT * FROM "
. tname(
"eventclass"
) .
" ORDER BY displayorder"
);
023.
while
(
$value
=
$_SGLOBAL
[
'db'
]->fetch_array(
$query
)){
024.
if
(
$value
[
'poster'
]) {
//如果存在发布人
025.
$value
[
'poster'
] =
"data/event/"
.
$value
[
'classid'
].
".jpg"
;
026.
}
else
{
//使用默认的图片
027.
$value
[
'poster'
] =
"image/event/default.jpg"
;
028.
}
029.
$_SGLOBAL
[
'eventclass'
][
$value
[
'classid'
]] =
$value
;
030.
}
031.
cache_write(
'eventclass'
,
"_SGLOBAL['eventclass']"
,
$_SGLOBAL
[
'eventclass'
]);
032.
//写入缓存文件
033.
}
034.
035.
/**
036.
* 更新道具信息
037.
*/
038.
function
magic_cache(){
039.
global
$_SGLOBAL
;
040.
041.
$_SGLOBAL
[
'magic'
] =
array
();
042.
// 从数据库获取
043.
$query
=
$_SGLOBAL
[
'db'
]->query(
"SELECT mid, name FROM "
.tname(
'magic'
).
" WHERE close='0'"
);
044.
while
(
$value
=
$_SGLOBAL
[
'db'
]->fetch_array(
$query
)){
045.
$_SGLOBAL
[
'magic'
][
$value
[
'mid'
]] =
$value
[
'name'
];
046.
}
047.
//写入道具缓存文件
048.
cache_write(
'magic'
,
"_SGLOBAL['magic']"
,
$_SGLOBAL
[
'magic'
]);
049.
}
050.
051.
/**
052.
* 递归清空目录
053.
* @param string $dir 要清空的目录名
054.
*/
055.
function
deltreedir(
$dir
) {
056.
$files
= sreaddir(
$dir
);
//获取目录内的文件
057.
foreach
(
$files
as
$file
) {
058.
if
(
is_dir
(
"$dir/$file"
)) {
//如果返回的存在目录,则再进行一次递归
059.
deltreedir(
"$dir/$file"
);
060.
}
else
{
061.
@unlink(
"$dir/$file"
);
//删除文件
062.
}
063.
}
064.
}
065.
066.
/**
067.
* 数组转换成字串
068.
* @param array $array 要转换的数组
069.
* @param int $level 数组的层次
070.
* @return string 返回转换后的字符串
071.
*/
072.
function
arrayeval(
$array
,
$level
= 0) {
073.
$space
=
''
;
074.
for
(
$i
= 0;
$i
<=
$level
;
$i
++) {
075.
$space
.=
"\t"
;
076.
}
077.
$evaluate
=
"Array\n$space(\n"
;
078.
$comma
=
$space
;
079.
foreach
(
$array
as
$key
=>
$val
) {
080.
//addcslashes($key, '\'\\');只对'与\进行转义
081.
$key
=
is_string
(
$key
) ?
'\''
.
addcslashes
(
$key
,
'\'\\').'
\
''
:
$key
;
082.
//如果$key不是数字,则设置为字符串,如果是数字,则直接取数字
083.
$val
= !
is_array
(
$val
) && (!preg_match(
"/^\-?\d+$/"
,
$val
) ||
strlen
(
$val
) > 12 ||
substr
(
$val
, 0, 1)==
'0'
) ?
'\''
.
addcslashes
(
$val
,
'\'\\').'
\
''
:
$val
;
084.
//如果$val不是数字,则设置为字符串,如果是数字,则直接取数字
085.
if
(
is_array
(
$val
)) {
086.
//如果是数组,则再一次进行转换
087.
$evaluate
.=
"$comma$key => "
.arrayeval(
$val
,
$level
+ 1);
088.
}
else
{
089.
$evaluate
.=
"$comma$key => $val"
;
090.
}
091.
$comma
=
",\n$space"
;
092.
}
093.
$evaluate
.=
"\n$space)"
;
094.
return
$evaluate
;
095.
}
096.
097.
/**
098.
*
099.
* @param string $name
100.
* @param <type> $var
101.
* @param <type> $values
102.
*
103.
*/
104.
function
cache_write(
$name
,
$var
,
$values
) {
105.
$cachefile
= S_ROOT.
'./data/data_'
.
$name
.
'.php'
;
//设置缓存文件地址
106.
$cachetext
=
"<?php\r\n"
.
107.
"if(!defined('IN_UCHOME')) exit('Access Denied');\r\n"
.
108.
'$'
.
$var
.
'='
.arrayeval(
$values
).
//将数组转换成字符串
109.
"\r\n?>"
;
110.
if
(!swritefile(
$cachefile
,
$cachetext
)) {
111.
exit
(
"File: $cachefile write error."
);
112.
}
113.
}
114.
115.
?>