关于APCU

APCu是PHP的替代缓存组件,用于替代不再维护的APC。它在PHP-FPM模式下能实现进程间缓存共享,但在CLI模式下不共享。APCu基于共享内存,提供快速的缓存访问,适用于数据量小、读取频繁的场景,如鉴权信息存储和抢购元数据缓存。然而,由于其单机内存限制和无法跨机器共享数据,不适合大规模或分布式环境。安装APCu时可能遇到编译错误,解决后可在php.ini中配置启用。
摘要由CSDN通过智能技术生成

关于APCU
APCU的前身是APC(Alternative PHP Cache)
但是PHP从PHP 5.5开始,使用ZendOptimizerPlus作为内置的Opcode Cache实现。所以现在APCU的主要功能便不再有意义了,而且其官方也随后表示不再维护APC了。
因此APCU出现了!
对于APCU而言,PHP-FPM模式下所有的php-fpm进程(即使是不同的pool)属于同一个父进程,所以是可以共享缓存数据的;但是cli模式每次都是单独一个全新进程,因而和php-fpm模式的进程是不能共享缓存数据的。所以如果你的业务场景需要在cli和php-fpm两种模式下共享数据一定要小心了,可能memcache或者redis才是你更好的选择。
以上内容出处:https://taobig.org/?p=612

1 编译安装 找最新版本的安装(>5.0.0)
地址: http://pecl.php.net/package/APCu

wget http://pecl.php.net/get/apcu-5.1.19.tgz 
tar xzf apcu-5.1.19.tgz 
cd apcu-5.1.19
/usr/local/php7/bin/phpize 
./configure --with-php-config=/usr/local/php7/bin/php-config 
make && make install

不同安装环境–with-php-config=/usr/local/php7/bin/php-config 文件地址不同

2 如果出现如下报错,原因未知,可能是脚本先后问题

c_shm.lo apc_sma.lo apc_stack.lo apc_signal.lo apc_iterator.lo apc_persist.lo -lrt
libtool: link: `apc.lo' is not a valid libtool object
make: *** [Makefile:221: apcu.la] Error 1
libtool: link: `apc.lo' is not a valid libtool object
make: *** [Makefile:221: apcu.la] Error 1

执行

make clean
./configure --with-php-config=/usr/local/php/bin/php-config 
make && make install

可以执行 查看是否成功
find / -name apcu.so

3 往 php.ini (末尾)添加

[apc]
extension = apcu.so
apc.enabled= on
apc.shm_size= 256M
apc.enable_cli = on #测试环境启用

4 php代码示例:

<?php
$bar = 'BAR';
apcu_store('foo', $bar);
var_dump(apcu_fetch('foo'));
?>

5 知识点:
以下内容出处:https://www.cnblogs.com/zhaoyixing/p/12635269.html
apcu是基于共享内存技术建设的,多个cgi之间访问apcu中的cache可以完全等同于访问自己进程的一块内存一样,不需要发任何的网络请求。而不管是redis、mysql或者其他的独立服务的cache都需要发网络请求,即使存储和服务部署在同一机器上也仍然需要采用本地sock进行网络请求,何况在虚拟化的趋势下,这些存储服务一定是独立运行的。按照计算机存储器层次结构的理论,访问内存的速度大概在纳秒级别 ,网络请求的速度在毫秒级别,同机架或者同机房的机器可能在1/10ms左右,还不考虑服务稳定性的情况下。
简单的进行存取测试,速度至少在千倍以上提升。

但是apc在实际的使用中还是存在一定的局限性:
1 以扩展的方式接入,跟php这门语言有很强的耦合,而redis作为独立服务存在,使用协议接入
2 apcu受限于单机内存的限制,扩展受阻,而目前的redis集群模式已经可以做到动态扩容,理论上无容量风险
3 apcu数据存于单机内存,多机器之间的数据无法共享,这是他使用场景有限的最大阻碍

所以,我再使用场景中一般用apcu来缓存数据量小、但是读取量大或者瞬间读取量大的场景。
比如:
1.你是一个开放平台,你需要对客户请求做鉴权,这个token过来的请求可以访问哪些path请求。这个场景下,用户的token及可访问的path信息持久化在mysql中,变更频次小,数据量小,但是可能每秒有10W次请求
这个场景就比较适合apc,相比于直接请求mysql/redis的架构,可以给服务省掉10w - N 次/s的网络消耗,N为容器数目

2.抢购的场景下,假设量比较大,那么可以使用apc来做s级别的缓存元信息,以防止对于存储服务的瞬间链接量过大,导致失败的情况。

几个关键字:数据大小小、读取量大、配置信息、无状态
而有状态的信息你还是选择mysql/redis,所以这么来看,他的场景的确是有限。但是在有限场景也能发挥他的价值,作为php多进程之间通信的一种方式,也顺利帮我优化了几万/s的mysql、redis请求。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值