// +---------------------------------------------------------------------- namespace think\cache\driver; use think\Cache; /** * 文件类型缓存类 * @author liu21st */ class File { protected $options = [ 'expire' => 0, 'cache_subdir' => false, 'path_level' => 1, 'prefix' => '', 'path' => CACHE_PATH, 'data_compress' => false, ]; /** * 架构函数 * @param array $options */ public function __construct($options = []) { if (!empty($options)) { $this->options = array_merge($this->options, $options); } if (substr($this->options['path'], -1) != DS) { $this->options['path'] .= DS; } $this->init(); } /** * 初始化检查 * @access private * @return boolean */ private function init() { // 创建项目缓存目录 if (!is_dir($this->options['path'])) { if (mkdir($this->options['path'], 0755, true)) { return true; } } return false; } /** * 取得变量的存储文件名 * @access private * @param string $name 缓存变量名 * @return string */ private function filename($name) { $name = md5($name); if ($this->options['cache_subdir']) { // 使用子目录 $dir = ''; $len = $this->options['path_level']; for ($i = 0; $i < $len; $i++) { $dir .= $name{$i} . DS; } if (!is_dir($this->options['path'] . $dir)) { mkdir($this->options['path'] . $dir, 0755, true); } $filename = $dir . $this->options['prefix'] . $name . '.php'; } else { $filename = $this->options['prefix'] . $name . '.php'; } return $this->options['path'] . $filename; } /** * 读取缓存 * @access public * @param string $name 缓存变量名 * @return mixed */ public function get($name) { $filename = $this->filename($name); if (!is_file($filename)) { return false; } $content = file_get_contents($filename); if (false !== $content) { $expire = (int) substr($content, 8, 12); if (0 != $expire && $_SERVER['REQUEST_TIME'] > filemtime($filename) + $expire) { //缓存过期删除缓存文件 $this->unlink($filename); return false; } $content = substr($content, 20, -3); if ($this->options['data_compress'] && function_exists('gzcompress')) { //启用数据压缩 $content = gzuncompress($content); } $content = unserialize($content); return $content; } else { return false; } } /** * 写入缓存 * @access public * @param string $name 缓存变量名 * @param mixed $value 存储数据 * @param int $expire 有效时间 0为永久 * @return boolean */ public function set($name, $value, $expire = null) { if (is_null($expire)) { $expire = $this->options['expire']; } $filename = $this->filename($name); $data = serialize($value); if ($this->options['data_compress'] && function_exists('gzcompress')) { //数据压缩 $data = gzcompress($data, 3); } $data = ""; $result = file_put_contents($filename, $data); if ($result) { clearstatcache(); return true; } else { return false; } } /** * 删除缓存 * @access public * @param string $name 缓存变量名 * @return boolean */ public function rm($name) { return $this->unlink($this->filename($name)); } /** * 清除缓存 * @access public * @return boolean */ public function clear() { $fileLsit = (array) glob($this->options['path'] . '*'); foreach ($fileLsit as $path) { is_file($path) && unlink($path); } return true; } /** * 判断文件是否存在后,删除 * @param $path * @return bool * @author byron sampson * @return boolean */ private function unlink($path) { return is_file($path) && unlink($path); } }