PHP APCu扩展


PHP APCu扩展


正文

在很多业务中,我们都会碰到需要缓存数据的时候,而缓存方案有很多,也可以借助Redis和Memcached等第三方来进行缓存。

Redis每秒可以处理上万请求. 适合作为缓存一些热点数据. 根据二八定律 我们可以将Mysql中20%的热点数据存入Redis。 Redis存入的数据也按照二八定律,其中20%的热点中的热点数据我们可以存入程序内。

其实在小项目中,PHP 也已经为我们准备好了一套简单的缓存系统,完全能够应付我们日常普通规模站点的开发。这一套扩展就是 APCu 扩展。

APCu 扩展

在PHP5版本用的是APC,PHP7之后就是APCU.它俩是同一东西.在php.ini的配置项中都以apc开头。 不过只支持FastCGI模式,PHP-CLI下会失效,FastCGI重启后会清除缓存。

它的缓存生命周期是整个PHP-FPM。当重启PHP-FPM时候才会清空,也就是说可以在同一PHP-FPM环境下跨文件和跨项目的使用它。

安装

1、下载地址 http://pecl.php.net/get/apcu-5.1.16.tgz

2、解压 tar zxvf apcu-5.1.16.tgz

3、cd apcu-5.1.16

4、生成configure文件

执行 /usr/local/php/bin/phpize , 其中/usr/local/php为php安装目录

5、配置编译参数

./configure --with-php-config=/usr/local/php/bin/php-config

其中usr/local/php为php安装目录

6、编译并安装

make && make install

7、修改配置文件php.ini

extension = apcu.so
apc.enabled= on
apc.shm_size= 64M
apc.enable_cli = on

8、重启php-fpm

方法说明

缓存系统一般都会有的增加、删除、查询、自增等功能都在 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 — 保存一个缓存

示例

$key='name';

$value='一二三';

var_dump(apcu_store($key , $value));

var_dump(apcu_fetch( $key ));

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

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_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 迭代器方便我们进行缓存信息的循环查询及相关统计。 总之,这一套系统是非常方便的一套小规模的缓存系统,在日常开发中完全可以尝试用到一些小功能上。

参考资料

PHP 手册 函数参考 影响 PHP 行为的扩展 APC User Cache https://www.php.net/manual/zh/apcu.configuration.php

安装php apcu扩展 https://blog.csdn.net/zxlfysj2/article/details/88727915

PHP缓存系统APCu扩展的使用 https://www.jb51.net/article/211041.htm

php自带的缓存扩展-APCu https://blog.csdn.net/moliyiran/article/details/89680434

PHP高性能缓存扩展-APCu http://www.webhuang.cn/archives/350


返回