composer install --apcu-autoloader 在 cli 下常无效果,因其依赖 apcu 在 cli 模式下启用(需 apc.enable_cli=1),而默认为 0;且仅当 --optimize-autoloader 同时启用、autoload_classmap.php 非空、apcu.stat=0 且 php-fpm 环境运行时才真正生效。

composer install --apcu-autoloader 为什么没写进 APCu
命令本身不校验 APCu 是否可用,apcu_store() 在 CLI 下静默失败是常态。最常见原因是 apc.enable_cli=1 没开——Web 环境能用 APCu,CLI 却完全不可写。
验证方式很简单:
- 运行
php -i | grep "Loaded Configuration File",确认 CLI 实际加载的php.ini路径 - 检查该文件中是否同时存在:
extension=apcu.so、apc.enabled=1、apc.enable_cli=1 - 执行
php -r "var_dump(apcu_store('test', 'ok'));",输出bool(false)就说明 CLI 下 APCu 写入已失效
注意:--apcu-autoloader 是 composer install 的参数,不是 dump-autoload 的子命令;后者用的是 --apcu,两者不能混用。
autoload_classmap.php 空或只有几十行,APCu 缓存就是空转
APCu 只缓存“类名 → 文件路径”这一条映射,它不加速查找逻辑本身。如果 vendor/composer/autoload_classmap.php 是空的或只有几十行,说明 --optimize-autoloader(或 -o)根本没真正触发全量扫描,APCu 就是在往空表里塞键。
生成有效 classmap 的前提条件:
-
composer.json中的autoload.classmap字段必须显式列出要扫描的目录,比如"src/",且末尾斜杠不能漏("src"会被跳过) - 或使用
composer install --optimize-autoloader,但它只扫autoload和autoload-dev中声明的路径——漏写"app/Exceptions/",它就不会被扫进去 - 检查生成的
autoload_classmap.php:几百 KB 起步、含数千个类路径才算有效
开了 APCu 还是慢?apcu.stat=0 是硬性前提
apcu.stat=1(默认值)会让 APCu 每次读缓存前都检查源文件修改时间,直接退化为“查缓存 → 发现过期 → 扫描文件系统 → 再存缓存”,比不用还多一次 stat 系统调用。
必须在 php.ini 中显式写 apcu.stat=0,改完需重启 PHP-FPM 或 Apache,并用 php -i | grep apcu.stat 确认输出为 0。
验证缓存是否真被写入和命中:
-
php -r "print_r(apcu_cache_info('user'));",应看到若干以composer-apcu-autoloader-开头的 key,且ttl字段非 0 - 在请求中加
var_dump(apcu_fetch('composer-apcu-autoloader-' . md5('PDO')));,确认返回的是字符串路径 - 用
strace -e trace=openat php -r "new PDO();"对比:优化后openat调用应从数百次降至个位数
OPcache 不配对,APCu 就是单点加速
APCu 缓存的是类名→路径映射,OPcache 缓存的是 PHP 字节码。两者必须协同:
-
opcache.enable=1和opcache.enable_cli=1都得开,否则autoload_static.php不进 opcode 缓存 -
opcache.revalidate_freq=0:生产环境禁用时间戳校验,否则每次请求都检查 classmap 文件修改时间 -
opcache.max_accelerated_files至少设为20000,大项目建议40000+,否则 classmap 数组太长会被截断 - 部署后务必
opcache_reset()或重启 php-fpm,避免旧 autoloader 缓存残留
真正卡住的从来不是 Composer 本身,而是每次请求都要拼路径、调 file_exists()、遍历目录——这个开销在 PHP-FPM 高并发下会被放大几十倍。二级缓存不是加了就快,是 classmap 必须先生成、authoritative 必须开启、APCu 和 OPcache 配置必须对齐,缺一不可。











