文件缓存

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‘);
时间: 2024-08-10 15:10:19

文件缓存的相关文章

文件缓存的场景

1.缓存一些不经常改的数据,如页面显示什么导航,侧边栏按什么分类 2.文件缓存系统设置:如缓存公司用哪个邮箱向用户发邮件:

PHP缓存之文件缓存

1.PHP文件缓存内容保存格式        PHP文件缓存内容保存格式主要有三种: (1)变量 var_export 格式化成PHP正常的赋值书写格式: (2)变量 serialize 序列化之后保存,用的时候反序列化: (3)变量 json_encode格式化之后保存,用的时候json_decode 互联网上测试结果是:serialize格式的文件解析效率大于Json,Json的解析效率大于PHP正常赋值. 所以我们要是缓存数据建议采用序列化的形式解析数据会更快. 2.PHP文件缓存的简单案

静态文件和文件缓存

静态文件和文件缓存 1.在应用配置 settings 中指定 static_path 选项来提供静态文件服务:   2.在应用配置 settings 中指定 static_url_prefix 选项来提供静态文件前缀服务: 3.在导入静态文件时用 {{static_url('XX.css')}} 方式实现主动缓存静态文件 Tornado中, 你可以通过在应用程序中指定特殊的 static_path 来提供静态文 件服务: settings = { "static_path": os.p

PHP文件缓存实现

有些时候,我们不希望使用redis等第三方缓存,使得系统依赖于其他服务.这时候,文件缓存会是一个不错的选择. 我们需要文件缓存实现哪些功能: 功能实现:get.set.has.increment.decrement.delete.flush 能够在较短的时间内返回数据 支持key过期 为了避免一个文件内的数据过大,造成读取文件的时候延迟较高,我们采用一个key-value一个文件的方式实现存储结构. 为了支持key过期,我们需要把expire数据写入到文件中,所以需要对写入的数据进行序列化处理

nginx静态文件缓存

open_file_cache max=65535 inactive=30s; open_file_cache 打开缓存的同时也指定了缓存最大数目,以及缓存的时间 open_file_cache_valid 60s; 在open_file_cache中指定检测正确信息的间隔时间 open_file_cache_min_uses 1; 在 inactive指定时间中没有使用到这个配置的次数的话就删除 最大缓存65535个文件,每个文件缓存30秒,每60秒检测一次,如果有更改或者如果没有用到1次,就

缓存处理类(MemoryCache结合文件缓存)

想提升站点的性能,于是增加了缓存,但是站点不会太大,于是不会到分布式memcached的缓存和redis这个nosql库,于是自己封装了.NET内置的缓存组件 原先使用System.Web.Caching.Cache,但是asp.net会在System.Web.Caching.Cache缓存页面等数据,于是替换了System.Web.Caching.Cache为MemoryCache. 而在使用MemoryCache的时候,重新启动网站会丢失缓存,于是加了自己的扩展,将缓存序列化存放在文件内,在

iOS 之 文件缓存

对于信息量不是太大的数据,可以使用文件缓存来处理.文件缓存可以缓存字典和数组. 步骤一:创建路径 路径要一级一级往下创建,基本不用考虑创建失败的情况.但是如果创建失败了要怎么做呢?按道理应该提示出来.结束往下的操作,因为没有办法继续创建下面的目录. 创建路径要放到~Document下面,在真机上才能运行. 创建路径只是目录,文件名称还要在读写时附加上. 步骤二:读写

PHP程序缓存之文件缓存处理方式

PHP程序缓存之文件缓存处理方式在开发程序过程中,缓存的设置大大提升程序效率,减小数据库负载.基本配置缓存和常规配置缓存 基本配置缓存在项目开发中类似这样子的格式: 文件:config.php $CFG['database'] = 'mysql'; $CFG['pconnect'] = '0'; $CFG['db_host'] = 'localhost'; $CFG['db_name'] = 'appcom'; $CFG['db_user'] = 'root'; $CFG['db_pass']

apache 下配置gzip 和静态文件缓存

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">在很多情况下需要客户短开启缓存,文件打开gzip压缩来加快页面加载速度.</span> 一.首先看下开启页面缓存(也就是经常说的页面过期时间) 1.apache中需要增加 LoadModule expires_module modules/mod_expires.so 如果是

PHP文件缓存与memcached缓存 相比 优缺点是什么呢

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 如果不考虑其他任何问题,只比较速度的话,那肯定是mem快,但他们各有优缺点. 文件缓存优点: 1.由于现在的硬盘都非常大,所有如果是大数据的时候,放硬盘里就比较合适,比如做一个cms网站,网站里有10万篇文章,生成的文件大小总数可能就会很大. 2.数据的存放较为安全,由于是硬盘存放,所以在意外掉电的情况下,缓存文件不会丢失. 3.易于扩展,如果硬盘不够用,可以更换大硬盘或者添加硬盘,在容量上受的限制很小. 文