使用APCu扩展实现缓存读写功能

Memcached和Redis能做的事APCu扩展基本都能做,小项目特别适合使用APCu扩展,因为它不需要额外搭建缓存服务器,只要通过pecl安装APCu扩展即可。
 
Memcached和Redis在读写数据时会使用网络模型,而APCu扩展没有网络消耗,所以APCu扩展的缓存读写效率比Memcached和Redis都要高。
 
APCu缓存的生命周期是整个PHP-FPM,也就是当PHP-FPM重启时缓存才会被清空,所以APCu缓存可以跨项目使用,只要这些项目使用同一个PHP-FPM即可。
 
扩展下载地址:https://pecl.php.net/package/apcu
 
不同版本的扩展对PHP版本有最低要求,这里以PHP 5.6安装apcu-4.0.11.tgz为例演示安装过程。

把apcu-4.0.11.tgz上传到服务器,然后使用PHP的pecl安装即可
[root@localhost ~]# /program/php/bin/pecl install apcu-4.0.11.tgz

修改php.ini文件,加入APCu扩展
[root@localhost ~]# vim /program/php/php.ini
………………
extension=apcu.so
………………
[root@localhost ~]# service php-fpm restart # 重启PHP-FPM使配置生效,可使用phpinfo()检查APCu扩展是否加载



以下是使用apcu_*()系列函数操作缓存的演示代码:

<?php
$key = 'profile';
$var = ['name' => '张三', 'age' => 18];


// 获取缓存(不存在的情况)
$exists = apcu_exists($key);
if ($exists === true) {
    $fetch = apcu_fetch($key);
    echo "俺叫{$fetch['name']},今年{$fetch['age']}岁。" . PHP_EOL;
} else {
    echo '缓存不存在' . PHP_EOL; // 缓存不存在
}


// 设置缓存,有效时间为3600秒,若有效时间设为0则永久有效
$store = apcu_store($key, $var, 3600);
if ($store === true) {
    echo '设置缓存成功' . PHP_EOL; // 设置缓存成功
} else {
    echo '设置缓存失败' . PHP_EOL;
}


// 获取缓存(存在的情况)
$exists = apcu_exists($key);
if ($exists === true) {
    $fetch = apcu_fetch($key);
    echo "俺叫{$fetch['name']},今年{$fetch['age']}岁。" . PHP_EOL; // 俺叫张三,今年18岁。
} else {
    echo '缓存不存在' . PHP_EOL;
}


// 删除缓存
$delete = apcu_delete($key);
if ($delete === true) {
    echo '删除缓存成功' . PHP_EOL; // 删除缓存成功
} else {
    echo '删除缓存失败' . PHP_EOL;
}


//========== 总结 ==========//
// 1、当缓存不存在时,使用apcu_fetch()去获取缓存会得到false,但是如果缓存值本身就是false的话也会得到false,
//    所以安全的做法是先用apcu_exists()判断缓存是否存在,确保了缓存是存在的才用apcu_fetch()去获取其值。


 
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() — 保存一个缓存

Copyright © 2024 码农人生. All Rights Reserved