PHP源码编译安装APCu扩展实现数据缓存

2024-07-30 16:11:19 浏览数 (2)

概述

PHP APCu(Advanced and Performance Caching User Cache)是一个用于共享内存的缓存系统,它提供了一个用户缓存机制,可以被PHP应用程序用来缓存数据。APCu是APC(Alternative PHP Cache)的一个分支,专为PHP 5.5及以上版本设计,并且不包含APC的OPcache功能。

特性

  1. 共享内存缓存:APCu使用共享内存来存储缓存数据,这意味着多个PHP进程可以访问相同的缓存数据,从而提高性能。
  2. 用户缓存:与APC的系统缓存不同,APCu专注于用户缓存。这意味着它主要用于存储用户会话数据和应用程序级别的缓存,而不是编译后的PHP代码。
  3. 易于使用:APCu提供了一组简单的函数来存储和检索缓存数据。例如:apcu_store()apcu_fetch()apcu_delete()等。
  4. 性能提升:通过缓存经常访问的数据,APCu可以显著减少数据库查询和文件I/O操作,从而提高应用程序的性能。
  5. 内存管理:APCu会自动管理缓存的内存使用,当内存不足时,它会根据需要自动清理旧的缓存数据。
  6. 安全性:APCu的缓存数据是进程隔离的,这意味着不同的PHP进程不能访问彼此的缓存数据,从而提高了安全性。
  7. 配置:可以通过php.ini文件配置APCu的相关参数,例如缓存大小、清理策略等。

安装

下载源码包并解压

代码语言:javascript复制
wget https://pecl.php.net/get/apcu-5.1.23.tgz
tar -zxvf apcu-5.1.23.tgz

编译

代码语言:javascript复制
cd apcu-5.1.23
/usr/local/php-7.4/bin/phpize

执行以下命令

代码语言:javascript复制
./configure --with-php-config=/usr/local/php-7.4/bin/php-config

可能会报错

代码语言:javascript复制
checking for grep that handles long lines and -e... /bin/grep
checking for egrep... /bin/grep -E
checking for a sed that does not truncate output... /bin/sed
checking for pkg-config... /usr/bin/pkg-config
checking pkg-config is at least version 0.9.0... yes
checking for cc... cc
checking whether the C compiler works... no
configure: error: in `/home/www/build/apcu-5.1.23':
configure: error: C compiler cannot create executables
See `config.log' for more details

查看错误日志config.log

代码语言:javascript复制
compilation terminated.
configure:2894: $? = 1
configure:2914: checking whether the C compiler works
configure:2936: cc    conftest.c  >&5
cc1: error: /usr/local/include/x86_64-linux-gnu: Permission denied
configure:2940: $? = 1
configure:2978: result: no
configure: failed program was:
| /* confdefs.h */
| #define PACKAGE_NAME ""
| #define PACKAGE_TARNAME ""
| #define PACKAGE_VERSION ""
| #define PACKAGE_STRING ""
| #define PACKAGE_BUGREPORT ""
| #define PACKAGE_URL ""
| /* end confdefs.h.  */
|
| int
| main ()
| {
|
|   ;
|   return 0;
| }
configure:2983: error: in `/home/www/build/apcu-5.1.23':
configure:2985: error: C compiler cannot create executables
See `config.log' for more details

可以看出error: /usr/local/include/x86_64-linux-gnu: Permission denied 这个提示语表示没有权限操作

解决方案使用sudo操作解决问题

代码语言:javascript复制
sudo ./configure --with-php-config=/usr/local/php-7.4/bin/php-config

编译安装

代码语言:javascript复制
sudo make -j4
sudo make install

如果没有报错,查看扩展是否安装成功

代码语言:javascript复制
ls -l /usr/local/php-7.4/lib/php/extensions/no-debug-non-zts-20190902/
total 183804
-rwxr-xr-x 1 root root    650472 Jul 24 09:34 apcu.so
-rwxr-xr-x 1 root root   1033840 Mar 17  2021 event.so
-rwxr-xr-x 1 root root    275008 Jul  2 11:01 gmssl.so
-rw-r--r-- 1 root root 131697456 Feb 25  2022 grpc.so
-rwxr-xr-x 1 root root   6252494 Mar 17  2021 opcache.a
-rwxr-xr-x 1 root root   2894784 Mar 17  2021 opcache.so
-rw-r--r-- 1 root root   1274552 Feb 25  2022 protobuf.so
-rwxr-xr-x 1 root root   2215880 Jun 14 19:12 rar.so
-rwxr-xr-x 1 root root    697352 Feb 22  2022 rdkafka.so
-rwxr-xr-x 1 root root   2850040 Mar 17  2021 redis.so
-rwxr-xr-x 1 root root  37484536 May 23 09:58 swoole.so
-rwxr-xr-x 1 root root     24176 May  2 11:38 utils.so
-rwxr-xr-x 1 root root    154120 Apr 21  2023 xhprof.so
-rwxr-xr-x 1 root root    684928 May  2 09:25 zephir_parser.so

配置APCu扩展

代码语言:javascript复制
sudo vim /usr/local/php-7.4/etc/php.ini

增加以下配置

代码语言:javascript复制
[apcu]
extension = apcu.so
apc.shm_size = 1024M

校验配置是否有效

代码语言:javascript复制
php -i |grep apcu

apcu
OLDPWD => /home/www/build/apcu-5.1.23/build
PWD => /home/www/build/apcu-5.1.23
$_SERVER['OLDPWD'] => /home/www/build/apcu-5.1.23/build
$_SERVER['PWD'] => /home/www/build/apcu-5.1.23

简单使用

进行读写

代码语言:javascript复制
<?php

$start = microtime(true);
for ($i = 0; $i < 10000; $i  ) {
    $key = 'apcu' . $i;
    apcu_add($key, $i);
    apcu_fetch($key);
}

echo microtime(true) - $start . PHP_EOL;
  • apcu_add(key, val, ttl) 设置值,注意,缓存有值的情况下无法设置值,类比Redis的setnx,类型支持标量、数组、与对象,这一点非常好。
  • apcu_fetch(key) 取缓存,获取不到返回false,并发情况下容易返回false 执行
代码语言:javascript复制
php apcu.php 
0.0011260509490967

Redis压测对比连接性能

方式

轮次

APCu耗时(秒)

Redis耗时(秒)

只读

10000

0.011

1.162

只写

10000

0.012

1.062

读写,一次new Redis

10000

0.011

2.117

读写,多次new Redis

10000

0.011

3.646

0 人点赞