1 <?PHP
2 defined('ROOT_DIR')
|| define('ROOT_DIR', str_replace('\\', '/', dirname(__FILE__)
. '/'));
3
4 /**
5 * 緩存類
6 *
7 * 實現分服務器文件緩存
8 *
9 * @version $Id: Caches.PHP 2009-07-13 mmfei<
[email protected]> $
10 * @author mmfei<
[email protected]>
11 */
12
class Caches{
13
private $intTimeOut
= 0; //超時時間,0為不超時
14
private $strFix
= ".date.PHP";
15
public static function fnGetCaches(
$server,
$key){
16
$o
= new Caches();
17
return $o
->GetCaches(
$server,
$key);
18 }
19
public static function fnCreateCaches(
$server,
$key,
$data,
$isreplace
=true,
$isbackup
=true){
20
$o
= new Caches();
21
return $o
->CreateCaches(
$server,
$key,
$data,
$isreplace
=true,
$isbackup
=true);
22 }
23 /**
24 * 獲得緩存
25 * 注意:如果設置了intTimeOut > 0 , 則不會返回超過存放時間的緩存
26 *
27 * @param string $server
28 * @param string $key
29 * @return mix
30 */
31
public function GetCaches(
$server,
$key){
32
$content
= '';
33
if(
$this
->IsExistsCaches(
$server,
$key)
&& $this
->GetTimeOut()
== 0
|| !$this
->IsTimeOutFile(
$this
->GetPath(
$server,
$key))){
34
$content
= file_get_contents(
$this
->GetPath(
$server,
$key));
35
$content
= $this
->Decode(
$content);
36 }
37
return $content;
38 }
39 /**
40 * 創建緩存
41 *
42 * @param string $server
43 * @param string $key
44 * @param mix $data
45 * @param boolean $isreplace
46 * @param boolean $isbackup
47 * @return boolean
48 */
49
public function CreateCaches(
$server,
$key,
$data,
$isreplace
=true,
$isbackup
=true){
50
if(
$this
->IsExistsCaches(
$server,
$key)){
51
if(
$isreplace){
52
if(
$isbackup
&& !$this
->BackupCache(
$server,
$key))
return false;
53 }
else{
54
return false;
55 }
56 }
57
58
if(
!is_dir(
$this
->GetCachePath()
.$server)
&& !$this
->CreateFolder(
$this
->GetCachePath()
.$server))
59
dIE("無權創建緩存文件");
60
return $this
->WriteFile(
$this
->GetPath(
$server,
$key),
$this
->Encode(
$data));
61 }
62
63 /**
64 * 清理緩存 , 需要備份
65 * 如果是清理服務器的緩存,不做備份,慎用!!!
66 *
67 * @param string $server
68 * @param string $key
69 * @param boolean $isbackup
70 * @return boolean
71 */
72
public function CleanCaches(
$server ,
$key
= '' ,
$isbackup
= true){
73
if(
empty(
$key)){//這裡不做備份,注意了!!!!
74
return $this
->DelDir(
$this
->GetCachePath()
.$server);
75 }
elseif(
$this
->IsExistsCaches(
$server,
$key)){
76
if(
$isbackup)
77
$this
->BackupCache(
$server,
$key);
78
return @unlink(
$this
->GetPath(
$server,
$key));
79 }
80
return true;
81 }
82
83 /**
84 * 備份緩存
85 *
86 * @param string $server
87 * @param string $key
88 * @return boolean
89 */
90
public function BackupCache(
$server
= '',
$key
=''){
91
if(
$this
->IsExistsCaches(
$server,
$key)){
92
if(
!is_dir(
$this
->GetBackupCachePath()
.$server))
93
$this
->CreateFolder(
$this
->GetBackupCachePath()
.$server);
94
return $this
->WriteFile(
$this
->GetBackupPath(
$server,
$key),
$this
->Decode(
$this
->GetCaches(
$server,
$key)));
95 }
96
return false;
97 }
98
99 /**
100 * 判斷是否已經存在緩存
101 *
102 * @param string $server
103 * @param string $key
104 * @return boolean
105 */
106
public function IsExistsCaches(
$server,
$key){
107
if(
empty(
$server)
|| empty(
$key))
return false;
108
$strFile
= $this
->GetPath(
$server,
$key);
109
return file_exists(
$strFile);
110 }
111 /**
112 * 是否超時
113 *
114 * @param string $server
115 * @param string $key
116 * @return boolean
117 */
118
public function IsTimeOut(
$server,
$key){
119
return $this
->IsTimeOutFile(
$this
->GetPath(
$server,
$key));
120 }
121 /**
122 * 設置超時時間
123 *
124 * @param integer $i
125 * @return void
126 */
127
public function SetTimeOut(
$i){
128
if((
int)
$i
< 0)
return false;
129
$this
->intTimeOut
= (
int)
$i;
130 }
131
132 /**
133 * 寫入文件
134 *
135 * @param string $strFile
136 * @param mix $strContent
137 * @param string $strMode 例如 : FILE_APPEND
138 * @return boolean
139 */
140
private function WriteFile(
$strFile ,
$strContent
= '' ,
$strMode
= ''){
141
if(
empty(
$strMode))
142
return file_put_contents(
$strFile,
$strContent);
143
else144
return file_put_contents(
$strFile,
$strContent,
$strMode);
145 }
146
147
private function Encode(
$s){
148
return serialize(
$s);
149 }
150
private function Decode(
$s){
151
return unserialize(
$s);
152 }
153
154 /**
155 * 獲得緩存文件路徑
156 *
157 * @param string $server
158 * @param string $key
159 * @return string
160 */
161
private function GetPath(
$server,
$key){
162
return $this
->GetCachePath()
.$server
."/"
.$key
.$this
->GetFix();
163 }
164
private function GetBackupPath(
$server,
$key){
165
return $this
->GetBackupCachePath()
.$server
."/"
.$key
.$this
->GetBackupFix();
166 }
167
168 /**
169 * 獲得緩存文件夾
170 *
171 * @return string
172 */
173
private function GetCachePath(){
174
return ROOT_DIR
. "Caches/";
175 }
176
177 /**
178 * 獲得備份緩存文件夾
179 *
180 * @return string
181 */
182
private function GetBackupCachePath(){
183
return ROOT_DIR
. "CachesBackup/";
184 }
185
186 /**
187 * 創建服務器的緩存文件夾
188 *
189 * @param string $server
190 * @return boolean
191 */
192
private function CreateServerFolder(
$server){
193
return $this
->CreateFolder(
$this
->GetCachePath()
.$server);
194 }
195 /**
196 * 是否存在服務器緩存文件夾
197 *
198 * @param string $server
199 * @return boolean
200 */
201
private function IsExistsServerFolder(
$server){
202
return is_dir(
$this
->GetCachePath()
.$server);
203 }
204 /**
205 * 創建文件夾
206 *
207 * @param string $strPath
208 * @return boolean
209 */
210
private function CreateFolder(
$strPath){
211
return mkdir(
$strPath,0777,true);
212 }
213 /**
214 * 獲取超時時間
215 *
216 * @return integer
217 */
218
private function GetTimeOut(){
219
return $this
->intTimeOut;
220 }
221 /**
222 * 指定的緩存文件是否已經超時
223 *
224 * @param string $strFile
225 * @return boolean
226 */
227
private function IsTimeOutFile(
$strFile){
228
if(
!file_exists(
$strFile))
return false;
229
$t
= time()
- filemtime(
$strFile);
230
return $t
>= $this
->GetTimeout();
231 }
232 /**
233 * 獲取緩存文件的後綴
234 *
235 * @return string
236 */
237
private function GetFix(){
238
return $this
->strFix;
239 }
240 /**
241 * 獲取備份緩存文件的後綴格式
242 *
243 * @return unknown
244 */
245
private function GetBackupFix(){
246
return ".backup."
.date("YmdHis")
.".PHP";
247 }
248 /**
249 * 刪除文件夾
250 * 包括文件夾下的所有文件 (危險操作!!慎用)
251 *
252 * @param string $strDir
253 * @return boolean
254 */
255
private function DelDir(
$strDir) {
256
if(
!is_dir(
$strDir))
return true;
257
258
$objHandle
= opendir(
$strDir);
259
while (
$objFile
= readdir(
$objHandle))
260
if(
$objFile
!="."
&& $objFile
!= ".."
&& $strFullPath
= $strDir
."/"
.$objFile)
261
if(
!is_dir(
$strFullPath)) unlink(
$strFullPath);
262
else $this
->DelDir(
$strFullPath);
263 closedir(
$objHandle);
264
return(rmdir(
$strDir));
265 }
266 }