1. /**
2. * 文件缓存类
3. *
4. * @copyright Copyright (c) 2006 - 2008 MYRIS.CN
5. * @author 志凡 <dzjzmj@gmail.com>
6. * @package cache
7. * @version v0.1
8. */
9. class FileCache {
10. /**
11. * @var string $cachePath 缓存文件目录
12. * @access public
13. */
14. public $cachePath = './';
15.
16. /**
17. * 构造函数
18. * @param string $path 缓存文件目录
19. */
20. function __construct($path = NULL) {
21. if ($path) {
22. $this->cachePath = $path;
23. }
24.
25.
26. }
27.
28. /**
29. * 析构函数
30. */
31. function __destruct() {
32. //nothing
33. }
34.
35. /**
36. * 在cache中设置键为$key的项的值,如果该项不存在,则新建一个项
37. * @param string $key 键值
38. * @param mix $var 值
39. * @param int $expire 到期秒数
40. * @param int $flag 标志位
41. * @return bool 如果成功则返回 TRUE,失败则返回 FALSE。
42. * @access public
43. */
44. public function set($key, $var, $expire = 36000, $flag = 0) {
45. $value = serialize($var);
46. $timeout = time() + $expire;
47. $result = safe_file_put_contents($this->cachePath . urlencode($key) .'.cache',
48. $timeout . '<<%-==-%>>' . $value);
49. return $result;
50. }
51.
52. /**
53. * 在cache中获取键为$key的项的值
54. * @param string $key 键值
55. * @return string 如果该项不存在,则返回false
56. * @access public
57. */
58. public function get($key) {
59. $file = $this->cachePath . urlencode($key) .'.cache';
60. if (file_exists($file)) {
61. $content = safe_file_get_contents($file);
62. if ($content===false) {
63. return false;
64. }
65. $tmp = explode('<<%-==-%>>', $content);
66. $timeout = $tmp[0];
67. $value = $tmp[1];
68. if (time()>$timeout) {
69. $result = false;
70. } else {
71. $result = unserialize($value);
72. }
73. } else {
74. $result = false;
75. }
76. return $result;
77. }
78.
79. /**
80. * 清空cache中所有项
81. * @return 如果成功则返回 TRUE,失败则返回 FALSE。
82. * @access public
83. */
84. public function flush() {
85. $fileList = FileSystem::ls($this->cachePath,array(),'asc',true);
86. return FileSystem::rm($fileList);
87. }
88.
89. /**
90. * 删除在cache中键为$key的项的值
91. * @param string $key 键值
92. * @return 如果成功则返回 TRUE,失败则返回 FALSE。
93. * @access public
94. */
95. public function delete($key) {
96. return FileSystem::rm($this->cachePath . $key .'.cache');
97. }
98. }
99.
100. if (!function_exists('safe_file_put_contents')) {
101. function safe_file_put_contents($filename, $content)
102. {
103. $fp = fopen($filename, 'wb');
104. if ($fp) {
105. flock($fp, LOCK_EX);
106. fwrite($fp, $content);
107. flock($fp, LOCK_UN);
108. fclose($fp);
109. return true;
110. } else {
111. return false;
112. }
113. }
114. }
115.
116. if (!function_exists('safe_file_get_contents')) {
117. function safe_file_get_contents($filename)
118. {
119. $fp = fopen($filename, 'rb');
120. if ($fp) {
121. flock($fp, LOCK_SH);
122. clearstatcache();
123. $filesize = filesize($filename);
124. if ($filesize > 0) {
125. $data = fread($fp, $filesize);
126. }
127. flock($fp, LOCK_UN);
128. fclose($fp);
129. return $data;
130. } else {
131. return false;
132. }
133. }
134. }
135.
136.
137. //例子
138. $cache = new FileCache();
139. $data = $cache->get('yourkey');//yourkey是你为每一个要缓存的数据定义的缓存名字
140. if ($data===false) {
141. $data = '从数据库取出的数据或很复杂很耗时的弄出来的数据';
142. $cache->set('yourkey',$data,3600);//缓存3600秒
143. }
看代码
例子解释
一开始你从缓存中取数据(get)如果数据有缓存就直接使用缓存中的数据了。
如果缓存过期或没有,那重新取数据(数据库或其它),然后保存到缓存中。再使用你的数据。
我们可以这样想,这个页面第一次被访问的时候,是取不到缓存数据的所以$data是false,这时按正常逻辑取数据。
过几份种再访问,这时你从缓存中可以取到数据,直接使用,跳过逻辑取数据。这样就省了很多时间哟。
过了1小时几份钟你再访问,这时候缓存过期了,返回false,那么重新取一次再缓存。
这样一直反复。可以看取,1小时才会逻辑取一次数据。这样就达到了缓存的目的。