apcu autoloader 需手动启用:先确保 apcu.enabled=1 且配置正确,再运行 composer dump-autoload --apcu;它仅缓存类名→路径映射,不加速文件加载,且 cli 与 fpm 缓存隔离。

为什么 composer install 后 APCu 没生效?
APCu 自动加载器不是默认开启的,装了 apcu 扩展、跑了 composer install,不代表自动用了缓存 —— 它压根没被启用。关键在是否显式启用了 Composer 的 APCu autoloader,且 PHP 进程能访问 APCu 共享内存。
- 必须先确认
apcu.enabled=1且apcu.shm_size足够(至少 32M,类多时建议 64M+) - 运行
composer dump-autoload --apcu,不是install或update自动触发 - PHP-FPM 或 CLI 模式下,APCu 的缓存隔离:FPM worker 进程之间共享,但 CLI 每次执行是独立进程,不共享缓存 —— 所以 CLI 下测不到“加速效果”是正常的
- 若用 OpCache,注意它和 APCu 是两套机制:OpCache 缓存编译后的 opcode,APCu autoloader 缓存的是类名 → 文件路径映射表,二者可共存
composer dump-autoload --apcu 报错 “APCu is not enabled”
错误信息 APCu is not enabled 表示 Composer 在运行时检测不到 APCu 扩展,哪怕 php -m | grep apcu 看起来正常。
- CLI 和 Web SAPI 的 php.ini 可能不同:检查
php -i | grep "Loaded Configuration File"和 Web 环境(如phpinfo())是否指向同一配置;常见坑是 CLI 开了 APCu,但 FPM 没开 - 扩展名要对得上:
extension=apcu.so(Linux/macOS)或extension=php_apcu.dll(Windows),且不能被;extension=apcu.so注释掉 - 某些 Docker 镜像或云环境禁用了
apc.enable_cli=1,导致 CLI 下 APCu 不可用 —— 虽然 autoloader 生成阶段需要 CLI 支持,但这个配置只影响 CLI 下的 APCu 功能,不影响 FPM 运行时
APCu autoloader 生效后,为什么某些类还是没命中缓存?
APCu autoloader 缓存的是 PSR-0/PSR-4 映射关系,不是文件内容。它只加速“类名查路径”这一步,不跳过 require_once。
- 仅对 Composer 自动生成的 autoload 配置生效(即
vendor/autoload.php加载的逻辑),手动require或include的文件不走这套缓存 - 如果项目里用了
classmap生成方式(如"autoload": {"classmap": ["src/"]}),这些类也会被写入 APCu 缓存;但动态注册的 autoloader(如spl_autoload_register回调)完全绕过 APCu - 缓存键基于 Composer 的 autoload 配置哈希,只要
composer.json中 autoload 段没变、没运行新dump-autoload,缓存就一直有效;但一旦改了命名空间映射,旧缓存不会自动失效,需手动清空:php -r "apcu_clear_cache('user');"
生产环境启用 APCu autoloader 的实际注意事项
它不是“开了就稳”,尤其在部署频繁或共享主机场景下,容易因缓存残留或权限问题反拖慢启动。
- 部署时务必加
--apcu参数:推荐在 CI/CD 流程中固定写成composer dump-autoload --apcu --optimize-autoloader --no-dev,漏掉--apcu就白搭 - APCu 的 user cache 默认无权限限制,但某些加固环境(如 suhosin、SELinux)可能拦截写入 —— 若
apcu_fetch始终返回false,检查apc.use_request_time和系统级限制 - 不要在本地开发环境强依赖它:因为 CLI 下缓存不共享,且每次
composer update后需重生成,反而增加心智负担;专注在 FPM / Apache 环境验证即可 - 监控小技巧:在入口加一行
var_dump(apcu_exists('composer-apcu-autoloader'));,上线前快速确认键是否存在
dump-autoload --apcu 后才存在,且只对那一份生成结果负责 —— 没有热更新,也没有自动兜底。











