聊聊APCU

APCU的前身是APC(Alternative PHP Cache),APC的主要用途有两项:

  1. 将PHP代码编译之后所产生的bytecode暂存在共享内存内供重复使用,以提升应用的运行效率。(Opcode Cache)
  2. 提供用户数据缓存功能。(User Data Cache)

其中第一点是其主要功能,因为PHP的运行机制——每次接受一个请求时都要初始化所有的资源(将源代码转换成Opcode,……),执行代码,然后释放资源;所以启用Opcache Cache后,可以在初始化资源阶段减少CPU和内存的消耗。

但是PHP从PHP 5.5开始,使用ZendOptimizerPlus作为内置的Opcode Cache实现。所以现在APCU的主要功能便不再有意义了,而且其官方也随后表示不再维护APC了。

因此APCU出现了!

APCu is APC stripped of opcode caching.

The first APCu codebase was versioned 4.0.0, it was forked from the head of the APC master branch at the time.

PHP 7 support is available as of APCu 5.0.0.

以上就是关于APCU的前世今生。目前还处于活跃开发中的与APCU类似的工具,还有laruence(鸟哥)开发的Yac。

那么很明确了,APCU就一个功能:用户数据缓存(User Data Cache or Object Caching)。

如何使用APCU嘛,大家看看文档就知道了

https://secure.php.net/manual/en/book.apcu.php

今天要说的是这个APCU缓存和memcahce/redis不一样的地方。你通过memcache/redis存储一个数据,在缓存有效期内,同一机器上的不同的PHP进程(FPM+CLI)都是能够取到这份数据的。

对的,注意关键字 “同一机器上的不同的PHP进程”,对于APCU而言,PHP-FPM模式下所有的php-fpm进程(即使是不同的pool)属于同一个父进程,所以是可以共享缓存数据的;但是cli模式每次都是单独一个全新进程,因而和php-fpm模式的进程是不能共享缓存数据的。所以如果你的业务场景需要在cli和php-fpm两种模式下共享数据一定要小心了,可能memcache或者redis才是你更好的选择。

 

References:

https://github.com/krakjoe/apcu/issues/121

https://github.com/krakjoe/apcu/issues/255

https://github.com/laruence/yac/issues/61