PHP缓存系统APCu扩展的使用

想必大家都使用过 memcached 或者 redis 这类的缓存系统来做日常的缓存,或者用来抗流量,或者用来保存一些常用的热点数据,其实在小项目中,PHP 也已经为我们准备好了一套简单的缓存系统,完全能够应付我们日常普通规模站点的开发。这一套扩展就是 APCu 扩展。

APCu 扩展

APCu 扩展是 APC 扩展的升级,APC 扩展已经不维护了。这两套扩展其实都是基于 opcode caching 。也就是 PHP 自身的 opcode 来实现的缓存能力。

APCu 的安装就和普通的 PHP 扩展一样,非常简单,最主要的是这个扩展还非常的小。不管下载还是安装都是秒级可以完成的。所以说能够非常方便的应用于小规模的项目,而且是 PHP 原生支持的,不需要额外的端口之类的配置。

方法说明

缓存系统一般都会有的增加、删除、查询、自增等功能都在 APCu 扩展中有对应的实现。

  • apcu_add — 创建一个新的缓存
  • apcu_cache_info — 查看 APCu 的全部缓存信息
  • apcu_cas — 更新一个缓存的值为新值
  • apcu_clear_cache — 清除全部的缓存
  • apcu_dec — 自减缓存值
  • apcu_delete — 删除一个缓存的内容
  • apcu_enabled — 当前环境下是否启用 APCu 缓存
  • apcu_entry — 原子地生成一个缓存实体
  • apcu_exists — 检查缓存是否存在
  • apcu_fetch — 查询缓存
  • apcu_inc — 自增缓存值
  • apcu_sma_info — 查询缓存的共享内存信息
  • apcu_store — 保存一个缓存

使用演示

apcu_add("int", 1);
apcu_add("string", "I'm String");
apcu_add("arr", [1,2,3]);

class A{
    private $apc = 1;
    function test(){
        echo "s";
    }
}

apcu_add("obj", new A);

var_dump(apcu_fetch("int"));
var_dump(apcu_fetch("string"));
var_dump(apcu_fetch("arr"));
var_dump(apcu_fetch("obj"));

正常的使用都是比较简单的,我们添加各种类型的数据都可以正常存入缓存。不过需要注意的是,我们可以直接保存对象进入 APCu 缓存中,不需要将它序列化或者JSON成字符串,系统会自动帮我们序列化。

apcu_add(string \key , mixedkey,mixedvar [, int ttl = 0 ]) 方法就是普通的添加一个缓存,ttl=0])方法就是普通的添加一个缓存,ttl 可以设置过期时间,也是以秒为单位,如果不设置就是长期有效的。注意,APCu 的缓存时限在一次 CLI 中有效,再调用一次 CLI 取不到上次 CLI 中设置的缓存内容。而在 PHP-FPM 中,重启 PHP-FPM 或 FastCGI 之后缓存会失效。

接下来我们重点测试一下几个不太常见的方法。

apcu_cas("int", 1, 2);
var_dump(apcu_fetch("int"));

// Warning  apcu_cas() expects parameter 2 to be int
apcu_cas("string", "I'm String", "I'm  New String");

apcu_cas(string $key , int $old , int $new) 是将一个 $old 值修改为 $new 值,它只能修改数字类型的内容,如果是字符串的修改会报错。这个函数有什么优势呢?它最大的优势是原子性的,也就是不受高并发的影响。与之类似的是 apcu_store(string $key , mixed $var [, int $ttl = 0 ]) 方法,不过这个方法只是简单的修改一个缓存的内容,如果这个缓存的键不存在的话,就新建一个,它不受类型的限制,当然也不具有原子性。

apcu_entry("entry", function($key){
    return "This is " . $key;
});
var_dump(apcu_fetch("entry"));

apcu_entry(string $key , callable $generator [, int $ttl = 0 ]) 这个函数的作用是如果 $key 这个缓存不存在,则执行 $generator 这个匿名函数,并将 $key 做为键值传递进去,然后生成也就是 return 一个内容做为这个缓存的值。

var_dump(apcu_cache_info());

最后,如果我们想查看当前系统中的所有 APCu 缓存信息的时候,直接用这个 apcu_cache_info() 函数即可。

总结

当缓存中的数据非常多时,它还提供了一个 APCUIterator 迭代器方便我们进行缓存信息的循环查询及相关统计。总之,这一套系统是非常方便的一套小规模的缓存系统,在日常开发中完全可以尝试用到一些小功能上。

测试代码:

github.com/zhangyue050…

以上就是PHP缓存系统APCu扩展的使用的详细内容,更多关于PHP缓存系统APCu扩展的资料请关注我们其它相关文章!

(0)

相关推荐

  • 解决PHP Opcache 缓存刷新、代码重载出现无法更新代码的问题

    问题背景 通过启用Opcache的缓存优化,将PHP代码预编译为Opcode缓存到共享内存中供进程反复调用,从而减少了重复从磁盘解析PHP代码的时间消耗,显著的提高了PHP性能,提升了业务性能的调用,但是也引发了一些问题,就是我们每次更新了相应的PHP代码后,web server 无法即时加载到更新后的代码. 解决方案 (一).设置Opcache脚本验证时间 可以通过更改 Opcache 以下两个配置选项来调整代码重载时间 opcache.revalidate_freq=0 检查脚本时间戳是否有

  • PHP使用OB缓存实现静态化功能示例

    本文实例讲述了PHP使用OB缓存实现静态化功能.分享给大家供大家参考,具体如下: 实现步骤 1.创建测试数据表并且写入数据 2.实现后台的更新操作.使用OB缓存针对每一个内容生成对应的HTML文件 3.显示前台的数据信息 具体实现 ①创建测试数据表并且写入数据(test.sql文件): #创建数据表 create table news( id int auto_increment, title varchar(100) not null default '', body text, primar

  • ThinkPHP3.2.3框架Memcache缓存使用方法实例总结

    本文实例讲述了ThinkPHP3.2.3框架Memcache缓存使用方法.分享给大家供大家参考,具体如下: 前面一篇文章讲述了Linux下安装Memcached服务器和客户端,这里来总结一下ThinkPHP3.2.3框架Memcache的使用方法. 方法一:原生Memcache的写法 public function test1() { $mc = new \Memcache(); //创建Memcache对象 $mc->connect("127.0.0.1", 11211); /

  • php加速缓存器opcache,apc,xcache,eAccelerator原理与配置方法实例分析

    本文实例讲述了php加速缓存器opcache,apc,xcache,eAccelerator原理与配置方法.分享给大家供大家参考,具体如下: 一.opcache opcache 通过将 PHP 脚本预编译的字节码存储到共享内存中来提升 PHP 的性能, 存储预编译字节码的好处就是 省去了每次加载和解析 PHP 脚本的开销. PHP 5.5.0 及后续版本中已经绑定了 opcache 扩展. 对于 PHP 5.2,5.3 和 5.4 版本可以使用PECL扩展中的 opcache 库. window

  • PHP网页缓存技术优点及代码实例

    前台静态化:把动态页面解析后保存为静态页面 文件缓存:把查询结果保存为文件,XML 内存缓存:memcache php缓存器:XCache.eaccelerator等 Memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像.视频.文件以及数据库检索的结果等.简单的说就是将数据调用到内存中,然后从内存中读取,从而大大提高读取速度. Memcache是danga的一个项目,最早是LiveJournal 服务的,最初为

  • PHP利用缓存处理用户注册时的邮箱验证,成功后用户数据存入数据库操作示例

    本文实例讲述了PHP利用缓存处理用户注册时的邮箱验证,成功后用户数据存入数据库.分享给大家供大家参考,具体如下: <?php header("content-type:text/html;charset=utf-8"); @$atc=$_GET['atc']; $mem=new Memcache(); $mem->connect("127.0.0.1","11211"); if($atc=="in"){ $res=

  • TP5(thinkPHP框架)实现后台清除缓存功能示例

    本文实例讲述了TP5(thinkPHP框架)实现后台清除缓存功能.分享给大家供大家参考,具体如下: layui插件 http://www.layui.com/ 1--common的文件 /** * 循环删除目录和文件 * @param string $dir_name * @return bool */ function delete_dir_file($dir_name) { $result = false; if(is_dir($dir_name)){ if ($handle = opend

  • 简单实用的PHP文本缓存类实例

    缓存在实际使用当中应用很广泛,可以减轻对服务器数据库的访问,提高运行速度.目前很多CMS内容管理系统中频繁使用缓存机制来提高系统运行的效率.下面是一个写得不错的缓存类,可以参考下缓存的机制与写法. cache.inc.php <?php class Cache { /** * $dir : 缓存文件存放目录 * $lifetime : 缓存文件有效期,单位为秒 * $cacheid : 缓存文件路径,包含文件名 * $ext : 缓存文件扩展名(可以不用),这里使用是为了查看文件方便 */ pr

  • thinkphp5redis缓存新增方法实例讲解

    找到该文件 thinkphp/library/think/cache/driver/Redis.php 进行新增方法 在这里 我就举例几个 如何添加 添加的方法查看 redis教程 /** * 返回列表中指定区间内的元素 * */ public function lrange($key,$start,$end){ return $this->handler->lrange($key,$start,$end); } /** * 在list左边新增元素 * */ public function l

  • PHP ob缓存以及ob函数原理实例解析

    ob缓存介绍 ob是output buffering的简称,输出缓冲区,缓冲区是通过php.ini中的output_buffering变量控制的.其默认值是off,可以设置为on来打开buffer.打来buffer后,即便程序中没有用ob函数,实际上代码也是使用了缓冲区的.另外,不管php.ini中output_buffering的设置,cli模式下的php始终默认是关闭的.为什么要是缓冲区呢?简单来说,高速的cpu早早处理完自己的数据,想通过线路传递给用户,但是线路太窄了,一下输送不过去.如果

随机推荐