// +---------------------------------------------------------------------- namespace think\cache\driver; /** * 文件类型缓存类 * @author liu21st */ class File { protected $options = [ 'expire' => 0, 'cache_subdir' => false, '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']) { // 使用子目录 $name = substr($md5, 0, 2) . DS . substr($md5, 2); } if ($this->options['prefix']) { $name = $this->options['prefix'] . DS . $name; } $filename = $this->options['path'] . $name . '.php'; $dir = dirname($filename); if (!is_dir($dir)) { mkdir($dir, 0755, true); } return $filename; } /** * 判断缓存是否存在 * @access public * @param string $name 缓存变量名 * @return bool */ public function has($name) { $filename = $this->filename($name); return is_file($filename); } /** * 读取缓存 * @access public * @param string $name 缓存变量名 * @param mixed $default 默认值 * @return mixed */ public function get($name, $default = false) { $filename = $this->filename($name); if (!is_file($filename)) { return $default; } $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 $default; } $content = substr($content, 20, -3); if ($this->options['data_compress'] && function_exists('gzcompress')) { //启用数据压缩 $content = gzuncompress($content); } $content = unserialize($content); return $content; } else { return $default; } } /** * 写入缓存 * @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 缓存变量名 * @param int $step 步长 * @return false|int */ public function inc($name, $step = 1) { if ($this->has($name)) { $value = $this->get($name) + $step; } else { $value = $step; } return $this->set($name, $value, 0) ? $value : false; } /** * 自减缓存(针对数值缓存) * @access public * @param string $name 缓存变量名 * @param int $step 步长 * @return false|int */ public function dec($name, $step = 1) { if ($this->has($name)) { $value = $this->get($name) - $step; } else { $value = $step; } return $this->set($name, $value, 0) ? $value : 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); } }