File.class.php 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
  8. // +----------------------------------------------------------------------
  9. // | Author: liu21st <liu21st@gmail.com>
  10. // +----------------------------------------------------------------------
  11. namespace Think\Cache\Driver;
  12. use Think\Cache;
  13. /**
  14. * 文件类型缓存类
  15. */
  16. class File extends Cache
  17. {
  18. /**
  19. * 架构函数
  20. * @access public
  21. */
  22. public function __construct($options = array())
  23. {
  24. if (!empty($options)) {
  25. $this->options = $options;
  26. }
  27. $this->options['temp'] = !empty($options['temp']) ? $options['temp'] : C('DATA_CACHE_PATH');
  28. $this->options['prefix'] = isset($options['prefix']) ? $options['prefix'] : C('DATA_CACHE_PREFIX');
  29. $this->options['expire'] = isset($options['expire']) ? $options['expire'] : C('DATA_CACHE_TIME');
  30. $this->options['length'] = isset($options['length']) ? $options['length'] : 0;
  31. if (substr($this->options['temp'], -1) != '/') {
  32. $this->options['temp'] .= '/';
  33. }
  34. $this->init();
  35. }
  36. /**
  37. * 初始化检查
  38. * @access private
  39. * @return boolean
  40. */
  41. private function init()
  42. {
  43. // 创建应用缓存目录
  44. if (!is_dir($this->options['temp'])) {
  45. mkdir($this->options['temp']);
  46. }
  47. }
  48. /**
  49. * 取得变量的存储文件名
  50. * @access private
  51. * @param string $name 缓存变量名
  52. * @return string
  53. */
  54. private function filename($name)
  55. {
  56. $name = md5(C('DATA_CACHE_KEY') . $name);
  57. if (C('DATA_CACHE_SUBDIR')) {
  58. // 使用子目录
  59. $dir = '';
  60. for ($i = 0; $i < C('DATA_PATH_LEVEL'); $i++) {
  61. $dir .= $name{$i} . '/';
  62. }
  63. if (!is_dir($this->options['temp'] . $dir)) {
  64. mkdir($this->options['temp'] . $dir, 0755, true);
  65. }
  66. $filename = $dir . $this->options['prefix'] . $name . '.php';
  67. } else {
  68. $filename = $this->options['prefix'] . $name . '.php';
  69. }
  70. return $this->options['temp'] . $filename;
  71. }
  72. /**
  73. * 读取缓存
  74. * @access public
  75. * @param string $name 缓存变量名
  76. * @return mixed
  77. */
  78. public function get($name)
  79. {
  80. $filename = $this->filename($name);
  81. if (!is_file($filename)) {
  82. return false;
  83. }
  84. N('cache_read', 1);
  85. $content = file_get_contents($filename);
  86. if (false !== $content) {
  87. $expire = (int) substr($content, 8, 12);
  88. if (0 != $expire && time() > filemtime($filename) + $expire) {
  89. //缓存过期删除缓存文件
  90. unlink($filename);
  91. return false;
  92. }
  93. if (C('DATA_CACHE_CHECK')) {
  94. //开启数据校验
  95. $check = substr($content, 20, 32);
  96. $content = substr($content, 52, -3);
  97. if (md5($content) != $check) {
  98. //校验错误
  99. return false;
  100. }
  101. } else {
  102. $content = substr($content, 20, -3);
  103. }
  104. if (C('DATA_CACHE_COMPRESS') && function_exists('gzcompress')) {
  105. //启用数据压缩
  106. $content = gzuncompress($content);
  107. }
  108. $content = unserialize($content);
  109. return $content;
  110. } else {
  111. return false;
  112. }
  113. }
  114. /**
  115. * 写入缓存
  116. * @access public
  117. * @param string $name 缓存变量名
  118. * @param mixed $value 存储数据
  119. * @param int $expire 有效时间 0为永久
  120. * @return boolean
  121. */
  122. public function set($name, $value, $expire = null)
  123. {
  124. N('cache_write', 1);
  125. if (is_null($expire)) {
  126. $expire = $this->options['expire'];
  127. }
  128. $filename = $this->filename($name);
  129. $data = serialize($value);
  130. if (C('DATA_CACHE_COMPRESS') && function_exists('gzcompress')) {
  131. //数据压缩
  132. $data = gzcompress($data, 3);
  133. }
  134. if (C('DATA_CACHE_CHECK')) {
  135. //开启数据校验
  136. $check = md5($data);
  137. } else {
  138. $check = '';
  139. }
  140. $data = "<?php\n//" . sprintf('%012d', $expire) . $check . $data . "\n?>";
  141. $result = file_put_contents($filename, $data);
  142. if ($result) {
  143. if ($this->options['length'] > 0) {
  144. // 记录缓存队列
  145. $this->queue($name);
  146. }
  147. clearstatcache();
  148. return true;
  149. } else {
  150. return false;
  151. }
  152. }
  153. /**
  154. * 删除缓存
  155. * @access public
  156. * @param string $name 缓存变量名
  157. * @return boolean
  158. */
  159. public function rm($name)
  160. {
  161. return unlink($this->filename($name));
  162. }
  163. /**
  164. * 清除缓存
  165. * @access public
  166. * @param string $name 缓存变量名
  167. * @return boolean
  168. */
  169. public function clear()
  170. {
  171. $path = $this->options['temp'];
  172. $files = scandir($path);
  173. if ($files) {
  174. foreach ($files as $file) {
  175. if ('.' != $file && '..' != $file && is_dir($path . $file)) {
  176. array_map('unlink', glob($path . $file . '/*.*'));
  177. } elseif (is_file($path . $file)) {
  178. unlink($path . $file);
  179. }
  180. }
  181. return true;
  182. }
  183. return false;
  184. }
  185. }