APCu需在non-ZTS PHP环境下运行,安装后须配置apc.shm_size=128M、apc.enable_cli=1及apc.user_ttl,并验证读写与内存余量,其缓存随FPM进程重启而清空,非持久化存储。

确认系统环境和PHP版本是否兼容APCu
APCu不支持所有PHP构建——尤其要避开ZTS(线程安全)版本,比如某些Docker镜像或CentOS Stream默认PHP包。PHP 8.2+在ZTS下会直接禁用APCu,apcu_fetch调用返回false且无提示。
执行以下命令验证:
php -v php -i | grep "Thread Safety" php -m | grep apcu
若输出为空或显示Thread Safety => enabled,说明当前PHP是ZTS构建,需切换为non-ZTS版本(如Ubuntu的php-apcu包默认适配,CentOS建议用php74-php-pecl-apcu等明确标注non-zts的SCL包)。
安装扩展并启用extension=apcu.so
不同发行版命令不同,但核心是:装对包 + 解开php.ini里的注释行。
- Ubuntu/Debian:
sudo apt install php-apcu,然后检查/etc/php/*/cli/php.ini和/etc/php/*/fpm/php.ini中是否有未注释的extension=apcu.so - CentOS/RHEL 7/8:
sudo yum install php-pecl-apcu(PHP 7.2+请用php72-php-pecl-apcu等带版本前缀的包),再确认/etc/php.d/40-apcu.ini存在且含extension=apcu.so - PHP-FPM用户必须同时改FPM和CLI两份配置,否则
php -r调试时永远apcu_fetch失败
改完后别忘了重启服务:sudo systemctl restart php-fpm nginx(或httpd)。
关键参数必须显式设置:apc.shm_size、apc.enable_cli
默认apc.shm_size=32M太小,高并发写入容易撑爆;而apc.enable_cli=0导致命令行调试失效——这两个值不设等于白装。
在php.ini或40-apcu.ini里追加:
apc.enabled=1 apc.shm_size=128M apc.enable_cli=1 apc.ttl=3600 apc.user_ttl=3600
注意:apc.shm_size单位是M(非MB),不能写成128MB;apc.ttl控制opcode缓存(APCu已废弃opcode功能,实际只影响旧兼容逻辑),真正管用户数据的是apc.user_ttl,但很多文档漏写这个,导致apcu_store($k, $v, 300)仍被全局ttl覆盖。
验证是否真生效,而不是“看起来有”
phpinfo()页面搜“APCu”只是第一步,还得实测读写:
- Web请求中执行:
var_dump(apcu_store('test_key', 'ok', 10));→ 应返回true - 紧接着
var_dump(apcu_fetch('test_key'));→ 应返回string(2) "ok" - CLI下跑:
php -r "var_dump(apcu_fetch('test_key'));"→ 若返回false,说明apc.enable_cli=0或没加载到CLI的ini - 查内存余量:
print_r(apcu_sma_info());看avail_mem是否远大于0,长期就得调大apc.shm_size
最容易被忽略的是:APCu缓存随PHP-FPM worker进程重启而清空,没有持久化。它不是Redis替代品,只是单机高频读场景下的临时加速器——这点不理解,后续所有优化都可能跑偏。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











