文件缓存

Cache:

  1 <?php
  2 class Cache
  3 {
  4     private static $_instance = null;
  5     
  6     protected $_options = array();
  7     
  8     protected function __construct()
  9     {
 10     }
 11     
 12     /**
 13      * 得到本类实例
 14      * array(
 15      *            'cache_dir' => '',
 16      *            'file_name_prefix' => '',
 17      *        )
 18      * @return Ambiguous
 19      */
 20     public static function getInstance($config)
 21     {
 22         if (self::$_instance === null) {
 23             self::$_instance           = new self();
 24             self::$_instance->_options = $config;
 25         }
 26         return self::$_instance;
 27     }
 28     
 29     /**
 30      * 得到缓存信息
 31      * 
 32      * @param string $id
 33      * @return boolean|array
 34      */
 35     public static function get($id)
 36     {
 37         $instance = self::$_instance;
 38         
 39         //缓存文件不存在
 40         if (!$instance->has($id)) {
 41             return false;
 42         }
 43         
 44         $file = $instance->_file($id);
 45         
 46         $data = $instance->_fileGetContents($file);
 47         
 48         if ($data['expire'] == 0 || time() < $data['expire']) {
 49             return $data['contents'];
 50         } else {
 51             @unlink($file); //过期删除缓存
 52         }
 53         return false;
 54     }
 55     
 56     /**
 57      * 设置一个缓存
 58      * 
 59      * @param string $id   缓存id
 60      * @param array  $data 缓存内容
 61      * @param int    $cacheLife 缓存生命 默认为0无限生命
 62      */
 63     public static function set($id, $data, $cacheLife = 0)
 64     {
 65         $instance = self::$_instance;
 66         
 67         $time              = time();
 68         $cache             = array();
 69         $cache['contents'] = $data;
 70         $cache['expire']   = $cacheLife === 0 ? 0 : $time + $cacheLife;
 71         $cache['mtime']    = $time;
 72         
 73         $file = $instance->_file($id);
 74         
 75         return $instance->_filePutContents($file, $cache);
 76     }
 77     
 78     /**
 79      * 清除一条缓存
 80      * 
 81      * @param string cache id    
 82      * @return void
 83      */
 84     public static function delete($id)
 85     {
 86         $instance = self::$_instance;
 87         
 88         if (!$instance->has($id)) {
 89             return false;
 90         }
 91         $file = $instance->_file($id);
 92         //删除该缓存
 93         return unlink($file);
 94     }
 95     
 96     /**
 97      * 判断缓存是否存在
 98      * 
 99      * @param string $id cache_id
100      * @return boolean true 缓存存在 false 缓存不存在
101      */
102     public static function has($id)
103     {
104         $instance = self::$_instance;
105         $file     = $instance->_file($id);
106         
107         if (!is_file($file)) {
108             return false;
109         }
110         return true;
111     }
112     
113     /**
114      * 通过缓存id得到缓存信息路径
115      * @param string $id
116      * @return string 缓存文件路径
117      */
118     protected function _file($id)
119     {
120         $instance = self::$_instance;
121         $fileNmae = $instance->_idToFileName($id);
122         return $instance->_options['cache_dir'] . $fileNmae;
123     }
124     
125     /**
126      * 通过id得到缓存信息存储文件名
127      * 
128      * @param  $id
129      * @return string 缓存文件名
130      */
131     protected function _idToFileName($id)
132     {
133         $instance = self::$_instance;
134         $prefix   = $instance->_options['file_name_prefix'];
135         return sha1($prefix . $id) . '.dat';
136     }
137     
138     /**
139      * 把数据写入文件
140      * 
141      * @param string $file 文件名称
142      * @param array  $contents 数据内容
143      * @return bool 
144      */
145     protected function _filePutContents($file, $contents)
146     {
147         $contents = serialize($contents);
148         
149         $result = false;
150         $f      = @fopen($file, 'w');
151         if ($f) {
152             @flock($f, LOCK_EX);
153             fseek($f, 0);
154             ftruncate($f, 0);
155             $tmp = @fwrite($f, $contents);
156             if (!($tmp === false)) {
157                 $result = true;
158             }
159             @flock($f, LOCK_UN);
160             @fclose($f);
161         }
162         @chmod($file, 0777);
163         return $result;
164     }
165     
166     /**
167      * 从文件得到数据
168      * 
169      * @param  sring $file
170      * @return boolean|array
171      */
172     protected function _fileGetContents($file)
173     {
174         if (!is_file($file)) {
175             return false;
176         }
177         
178         $f = @fopen($file, 'r');
179         @$data = fread($f, filesize($file));
180         @fclose($f);
181         
182         return unserialize($data);
183     }
184     
185     /**
186      * 设置缓存路径
187      * 
188      * @param string $path
189      * @return self
190      */
191     public static function setCacheDir($path)
192     {
193         $instance = self::$_instance;
194         if (!is_dir($path)) {
195             exit('file_cache: ' . $path . ' 不是一个有效路径 ');
196         }
197         if (!is_writable($path)) {
198             exit('file_cache: 路径 "' . $path . '" 不可写');
199         }
200         
201         $path                            = rtrim($path, '/') . '/';
202         $instance->_options['cache_dir'] = $path;
203         
204         return $instance;
205     }
206     
207     /**
208      * 设置缓存文件前缀
209      * 
210      * @param srting $prefix
211      * @return self
212      */
213     public static function setCachePrefix($prefix)
214     {
215         $instance                               = self::$_instance;
216         $instance->_options['file_name_prefix'] = $prefix;
217         return $instance;
218     }
219     
220     /**
221      * 删除所有缓存
222      * @return boolean
223      */
224     public static function flush()
225     {
226         $instance = self::$_instance;
227         $glob     = @glob($instance->_options['cache_dir'] . '*');
228         
229         if (empty($glob)) {
230             return false;
231         }
232         
233         foreach ($glob as $v) {
234             @unlink($v);
235         }
236         
237         return true;
238     }
239 }

调用:

 1 <?php
 2 require 'FileCache.php';
 3 
 4 $cachPath = dirname(__FILE__) . '/cache/';
 5 
 6 $config = array(
 7     'cache_dir' => $cachPath,
 8     'file_name_prefix' => 'cache',
 9 );
10 
11 $cache = Cache::getInstance($config);
12 
13 $cache->set('sex', 'women', 5);
14 $cache->set('name', 'jack');
15 
16 $cache->set('age', 20, 3);
17 
18 echo $cache->get('name');
19 echo $cache->get('sex');
原文地址:https://www.cnblogs.com/KTblog/p/5927281.html