search
Homephp教程php手册PHP缓存技术实现
PHP缓存技术实现Jun 21, 2016 am 08:52 AM
cachefunctionkeypublicreturn

  发个PHP缓存实现,实现了apc和文件缓存,继承Cache_Abstract即可实现调用第三方的缓存工具。

  参考shindig的缓存类和apc。

  Php代码

  

  class CacheException extends Exception {}

  /**

  * 缓存抽象类

  */

  abstract class Cache_Abstract {

  /**

  * 读缓存变量

  *

  * @param string $key 缓存下标

  * @return mixed

  */

  abstract public function fetch($key);

  /**

  * 缓存变量

  *

  * @param string $key 缓存变量下标

  * @param string $value 缓存变量的值

  * @return bool

  */

  abstract public function store($key, $value);

  /**

  * 删除缓存变量

  *

  * @param string $key 缓存下标

  * @return Cache_Abstract

  */

  abstract public function delete($key);

  /**

  * 清(删)除所有缓存

  *

  * @return Cache_Abstract

  */

  abstract public function clear();

  /**

  * 锁定缓存变量

  *

  * @param string $key 缓存下标

  * @return Cache_Abstract

  */

  abstract public function lock($key);

  /**

  * 缓存变量解锁

  *

  * @param string $key 缓存下标

  * @return Cache_Abstract

  */

  abstract public function unlock($key);

  /**

  * 取得缓存变量是否被锁定

  *

  * @param string $key 缓存下标

  * @return bool

  */

  abstract public function isLocked($key);

  /**

  * 确保不是锁定状态

  * 最多做$tries次睡眠等待解锁,超时则跳过并解锁

  *

  * @param string $key 缓存下标

  */

  public function checkLock($key) {

  if (!$this->isLocked($key)) {

  return $this;

  }

  $tries = 10;

  $count = 0;

  do {

  usleep(200);

  $count ++;

  } while ($count isLocked($key)); // 最多做十次睡眠等待解锁,超时则跳过并解锁

  $this->isLocked($key) && $this->unlock($key);

  return $this;

  }

  }

  /**

  * APC扩展缓存实现

  *

  *

  * @category Mjie

  * @package Cache

  * @author 流水孟春

  * @copyright Copyright (c) 2008- (at)qq.com>

  * @license New BSD License

  * @version $Id: Cache/Apc.php 版本号 2010-04-18 23:02 cmpan $

  */

  class Cache_Apc extends Cache_Abstract {

  protected $_prefix = 'cache.mjie.net';

  public function __construct() {

  if (!function_exists('apc_cache_info')) {

  throw new CacheException('apc extension didn\'t installed');

  }

  }

  /**

  * 保存缓存变量

  *

  * @param string $key

  * @param mixed $value

  * @return bool

  */

  public function store($key, $value) {

  return apc_store($this->_storageKey($key), $value);

  }

  /**

  * 读取缓存

  *

  * @param string $key

  * @return mixed

  */

  public function fetch($key) {

  return apc_fetch($this->_storageKey($key));

  }

  /**

  * 清除缓存

  *

  * @return Cache_Apc

  */

  public function clear() {

  apc_clear_cache();

  return $this;

  }

  /**

  * 删除缓存单元

  *

  * @return Cache_Apc

  */

  public function delete($key) {

  apc_delete($this->_storageKey($key));

  return $this;

  }

  /**

  * 缓存单元是否被锁定

  *

  * @param string $key

  * @return bool

  */

  public function isLocked($key) {

  if ((apc_fetch($this->_storageKey($key) . '.lock')) === false) {

  return false;

  }

  return true;

  }

  /**

  * 锁定缓存单元

  *

  * @param string $key

  * @return Cache_Apc

  */

  public function lock($key) {

  apc_store($this->_storageKey($key) . '.lock', '', 5);

  return $this;

  }

  /**

  * 缓存单元解锁

  *

  * @param string $key

  * @return Cache_Apc

  */

  public function unlock($key) {

  apc_delete($this->_storageKey($key) . '.lock');

  return $this;

  }

  /**

  * 完整缓存名

  *

  * @param string $key

  * @return string

  */

  private function _storageKey($key) {

  return $this->_prefix . '_' . $key;

  }

  }

  /**

  * 文件缓存实现

  *

  *

  * @category Mjie

  * @package Cache

  * @author 流水孟春

  * @copyright Copyright (c) 2008- (at)qq.com>

  * @license New BSD License

  * @version $Id: Cache/File.php 版本号 2010-04-18 16:46 cmpan $

  */

  class Cache_File extends Cache_Abstract {

  public $useSubdir = false;

  protected $_cachesDir = 'cache';

  public function __construct() {

  if (defined('DATA_DIR')) {

  $this->_setCacheDir(DATA_DIR . '/cache');

  }

  }

  /**

  * 获取缓存文件

  *

  * @param string $key

  * @return string

  */

  protected function _getCacheFile($key) {

  $subdir = $this->useSubdir ? substr($key, 0, 2) . '/' : '';

  return $this->_cachesDir . '/' . $subdir . $key . '.php';

  }

  /**

  * 读取缓存变量

  * 为防止信息泄露,缓存文件格式为php文件,并以""开头

  *

  * @param string $key 缓存下标

  * @return mixed

  */

  public function fetch($key) {

  $cacheFile = self::_getCacheFile($key);

  if (file_exists($cacheFile) && is_readable($cacheFile)) {

  // include 方式

  //return include $cacheFile;

  // 系列化方式

  return unserialize(@file_get_contents($cacheFile, false, NULL, 13));

  }

  return false;

  }

  /**

  * 缓存变量

  * 为防止信息泄露,缓存文件格式为php文件,并以""开头

  *

  * @param string $key 缓存变量下标

  * @param string $value 缓存变量的值

  * @return bool

  */

  public function store($key, $value) {

  $cacheFile = self::_getCacheFile($key);

  $cacheDir = dirname($cacheFile);

  if(!is_dir($cacheDir)) {

  if(!@mkdir($cacheDir, 0755, true)) {

  throw new CacheException("Could not make cache directory");

  }

  }

  // 用include方式

  //return @file_put_contents($cacheFile, '

  return @file_put_contents($cacheFile, '' . serialize($value));

  }

  /**

  * 删除缓存变量

  *

  * @param string $key 缓存下标

  * @return Cache_File

  */

  public function delete($key) {

  if(emptyempty($key)) {

  throw new CacheException("Missing argument 1 for Cache_File::delete()");

  }

  $cacheFile = self::_getCacheFile($key);

  if(!@unlink($cacheFile)) {

  throw new CacheException("Cache file could not be deleted");

  }

  return $this;

  }

  /**

  * 缓存单元是否已经锁定

  *

  * @param string $key

  * @return bool

  */

  public function isLocked($key) {

  $cacheFile = self::_getCacheFile($key);

  clearstatcache();

  return file_exists($cacheFile . '.lock');

  }

  /**

  * 锁定

  *

  * @param string $key

  * @return Cache_File

  */

  public function lock($key) {

  $cacheFile = self::_getCacheFile($key);

  $cacheDir = dirname($cacheFile);

  if(!is_dir($cacheDir)) {

  if(!@mkdir($cacheDir, 0755, true)) {

  if(!is_dir($cacheDir)) {

  throw new CacheException("Could not make cache directory");

  }

  }

  }

  // 设定缓存锁文件的访问和修改时间

  @touch($cacheFile . '.lock');

  return $this;

  }

  /**

  * 解锁

  *

  * @param string $key

  * @return Cache_File

  */

  public function unlock($key) {

  $cacheFile = self::_getCacheFile($key);

  @unlink($cacheFile . '.lock');

  return



Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
SQL中的identity属性是什么意思?SQL中的identity属性是什么意思?Feb 19, 2024 am 11:24 AM

SQL中的Identity是什么,需要具体代码示例在SQL中,Identity是一种用于生成自增数字的特殊数据类型,它常用于唯一标识表中的每一行数据。Identity列通常与主键列配合使用,可以确保每条记录都有一个独一无二的标识符。本文将详细介绍Identity的使用方式以及一些实际的代码示例。Identity的基本使用方式在创建表时,可以使用Identit

C语言return的用法详解C语言return的用法详解Oct 07, 2023 am 10:58 AM

C语言return的用法有:1、对于返回值类型为void的函数,可以使用return语句来提前结束函数的执行;2、对于返回值类型不为void的函数,return语句的作用是将函数的执行结果返回给调用者;3、提前结束函数的执行,在函数内部,我们可以使用return语句来提前结束函数的执行,即使函数并没有返回值。

SpringBoot怎么监听redis Key变化事件SpringBoot怎么监听redis Key变化事件May 26, 2023 pm 01:55 PM

一、功能概览键空间通知使得客户端可以通过订阅频道或模式,来接收那些以某种方式改动了Rediskey变化的事件。所有修改key键的命令。所有接收到LPUSHkeyvalue[value…]命令的键。db数据库中所有已过期的键。事件通过Redis的订阅与发布功能(pub/sub)来进行分发,因此所有支持订阅与发布功能的客户端都可以在无须做任何修改的情况下,直接使用键空间通知功能。因为Redis目前的订阅与发布功能采取的是发送即忘(fireandforget)策略,所以如果你的程

入职后,我才明白什么叫Cache入职后,我才明白什么叫CacheJul 31, 2023 pm 04:03 PM

事情其实是这样的,当时领导交给我一个perf硬件性能监视的任务,在使用perf的过程中,输入命令perf list,我看到了以下信息:我的任务就要让这些cache事件能够正常计数,但关键是,我根本不知道这些misses、loads是什么意思。

function是什么意思function是什么意思Aug 04, 2023 am 10:33 AM

function是函数的意思,是一段具有特定功能的可重复使用的代码块,是程序的基本组成单元之一,可以接受输入参数,执行特定的操作,并返回结果,其目的是封装一段可重复使用的代码,提高代码的可重用性和可维护性。

Java中return和finally语句的执行顺序是怎样的?Java中return和finally语句的执行顺序是怎样的?Apr 25, 2023 pm 07:55 PM

源码:publicclassReturnFinallyDemo{publicstaticvoidmain(String[]args){System.out.println(case1());}publicstaticintcase1(){intx;try{x=1;returnx;}finally{x=3;}}}#输出上述代码的输出可以简单地得出结论:return在finally之前执行,我们来看下字节码层面上发生了什么事情。下面截取case1方法的部分字节码,并且对照源码,将每个指令的含义注释在

Unpatchable Yubico two-factor authentication key vulnerability breaks the security of most Yubikey 5, Security Key, and YubiHSM 2FA devicesUnpatchable Yubico two-factor authentication key vulnerability breaks the security of most Yubikey 5, Security Key, and YubiHSM 2FA devicesSep 04, 2024 pm 06:32 PM

An unpatchable Yubico two-factor authentication key vulnerability has broken the security of most Yubikey 5, Security Key, and YubiHSM 2FA devices. The Feitian A22 JavaCard and other devices using Infineon SLB96xx series TPMs are also vulnerable.All

redis批量删除key值的问题怎么解决redis批量删除key值的问题怎么解决May 31, 2023 am 08:59 AM

遇到的问题:在开发过程中,会遇到要批量删除某种规则的key,例如login_logID(ID为变量),现在需要删除"login_log*"这一类的数据,但是redis本身只有批量查询一类key值的命令keys,但是没有批量删除某一个类的命令。解决办法:先查询,在删除,使用xargs传参(xargs可以将管道或标准输入(stdin)数据转换成命令行参数),先执行查询语句,在将查询出来的key值,当初del的参数去删除。redis-cliKEYSkey*(查找条件)|xargsr

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

Repo: How To Revive Teammates
1 months agoBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
2 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: How To Get Giant Seeds
1 months agoBy尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Dreamweaver Mac version

Dreamweaver Mac version

Visual web development tools

MantisBT

MantisBT

Mantis is an easy-to-deploy web-based defect tracking tool designed to aid in product defect tracking. It requires PHP, MySQL and a web server. Check out our demo and hosting services.

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Integrate Eclipse with SAP NetWeaver application server.

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)