PHP文件缓存实现
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了PHP文件缓存实现,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4843字,纯文字阅读大概需要7分钟。
内容图文
有些时候,我们不希望使用redis等第三方缓存,使得系统依赖于其他服务。这时候,文件缓存会是一个不错的选择。
我们需要文件缓存实现哪些功能:
功能实现:get、set、has、increment、decrement、delete、flush
能够在较短的时间内返回数据
支持key过期
为了避免一个文件内的数据过大,造成读取文件的时候延迟较高,我们采用一个key-value一个文件的方式实现存储结构。
为了支持key过期,我们需要把expire数据写入到文件中,所以需要对写入的数据进行序列化处理
为了能够快速的定位到文件路径,我们采用hash算法一次计算出文件位置
<?php class FileCache { /** * 缓存目录 * @var */private$cache_dir; /** * @param $cache_dir * @throws Exception */publicfunction __construct($cache_dir) { $this->cache_dir = $cache_dir; if (!is_dir($cache_dir)) { $make_dir_result = mkdir($cache_dir, 0755, true); if ($make_dir_result === false) thrownewException(‘Cannot create the cache directory‘); } } /** * 根据key获取值,会判断是否过期 * @param $key * @return mixed */publicfunction get($key) { $cache_data = $this->getItem($key); if ($cache_data === false || !is_array($cache_data)) returnfalse; return$cache_data[‘data‘]; } /** * 添加或覆盖一个key * @param $key * @param $value * @param $expire * @return mixed */publicfunction set($key, $value, $expire = 0) { return$this->setItem($key, $value, time(), $expire); } /** * 设置包含元数据的信息 * @param $key * @param $value * @param $time * @param $expire * @return bool */privatefunction setItem($key, $value, $time, $expire) { $cache_file = $this->createCacheFile($key); if ($cache_file === false) returnfalse; $cache_data = array(‘data‘ => $value, ‘time‘ => $time, ‘expire‘ => $expire); $cache_data = json_encode($cache_data); $put_result = file_put_contents($cache_file, $cache_data); if ($put_result === false) returnfalse; returntrue; } /** * 创建缓存文件 * @param $key * @return bool|string */privatefunction createCacheFile($key) { $cache_file = $this->path($key); if (!file_exists($cache_file)) { $directory = dirname($cache_file); if (!is_dir($directory)) { $make_dir_result = mkdir($directory, 0755, true); if ($make_dir_result === false) returnfalse; } $create_result = touch($cache_file); if ($create_result === false) returnfalse; } return$cache_file; } /** * 判断Key是否存在 * @param $key * @return mixed */publicfunction has($key) { $value = $this->get($key); if ($value === false) returnfalse; returntrue; } /** * 加法递增 * @param $key * @param int $value * @return mixed */publicfunction increment($key, $value = 1) { $item = $this->getItem($key); if ($item === false) { $set_result = $this->set($key, $value); if ($set_result === false) returnfalse; return$value; } $check_expire = $this->checkExpire($item); if ($check_expire === false) returnfalse; $item[‘data‘] += $value; $result = $this->setItem($key, $item[‘data‘], $item[‘time‘], $item[‘expire‘]); if ($result === false) returnfalse; return$item[‘data‘]; } /** * 减法递增 * @param $key * @param int $value * @return mixed */publicfunction decrement($key, $value = 1) { $item = $this->getItem($key); if ($item === false) { $value = 0 - $value; $set_result = $this->set($key, $value); if ($set_result === false) returnfalse; return$value; } $check_expire = $this->checkExpire($item); if ($check_expire === false) returnfalse; $item[‘data‘] -= $value; $result = $this->setItem($key, $item[‘data‘], $item[‘time‘], $item[‘expire‘]); if ($result === false) returnfalse; return$item[‘data‘]; } /** * 删除一个key,同事会删除缓存文件 * @param $key * @return mixed */publicfunction delete($key) { $cache_file = $this->path($key); if (file_exists($cache_file)) { $unlink_result = unlink($cache_file); if ($unlink_result === false) returnfalse; } returntrue; } /** * 清楚所有缓存 * @return mixed */publicfunctionflush() { return$this->delTree($this->cache_dir); } /** * 递归删除目录 * @param $dir * @return bool */function delTree($dir) { $files = array_diff(scandir($dir), array(‘.‘, ‘..‘)); foreach ($filesas$file) { (is_dir("$dir/$file")) ? $this->delTree("$dir/$file") : unlink("$dir/$file"); } returnrmdir($dir); } /** * 根据key获取缓存文件路径 * * @param string $key * @return string */protectedfunction path($key) { $parts = array_slice(str_split($hash = md5($key), 2), 0, 2); return$this->cache_dir . ‘/‘ . implode(‘/‘, $parts) . ‘/‘ . $hash; } /** * 获取含有元数据的信息 * @param $key * @return bool|mixed|string */protectedfunction getItem($key) { $cache_file = $this->path($key); if (!file_exists($cache_file) || !is_readable($cache_file)) { returnfalse; } $cache_data = file_get_contents($cache_file); if (empty($cache_data)) returnfalse; $cache_data = json_decode($cache_data, true); if ($cache_data) { $check_expire = $this->checkExpire($cache_data); if ($check_expire === false) { $this->delete($key); returnfalse; } } return$cache_data; } /** * 检查key是否过期 * @param $cache_data * @return bool */protectedfunction checkExpire($cache_data) { $time = time(); $is_expire = intval($cache_data[‘expire‘]) !== 0 && (intval($cache_data[‘time‘]) + intval($cache_data[‘expire‘]) < $time); if ($is_expire) returnfalse; returntrue; } }
原文:http://www.cnblogs.com/DoNetCShap/p/6230967.html
内容总结
以上是互联网集市为您收集整理的PHP文件缓存实现全部内容,希望文章能够帮你解决PHP文件缓存实现所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。