因为--apcu只缓存已有类映射,而--optimize-autoloader才生成完整的autoload_classmap.php供其缓存;不搭配则apcu存入空数组,毫无加速效果。

composer dump-autoload --apcu 为什么必须搭配 --optimize-autoloader?
因为 --apcu 本身不生成类映射表,它只把已有的映射“存进 APCu”;而默认的 PSR-4 加载器是运行时动态拼路径的,没有静态映射可缓存。--optimize-autoloader(或 -o)会强制 Composer 扫描所有声明的命名空间路径,生成完整的 vendor/composer/autoload_classmap.php —— 这才是 APCu 能存、能查的数据源。
常见错误:
- 只跑
composer dump-autoload --apcu→autoload_classmap.php几乎为空,APCu 存了个空数组 - 在
composer.json里没配"classmap": ["src/"]或路径写错(比如漏掉末尾/),导致扫描不到类 - 用
composer install --apcu-autoloader→ 命令无效,Composer 不识别该参数
APCu 缓存没命中?先检查这三个 PHP 配置项
即使命令跑成功、apcu_fetch('composer-apcu-autoloader-*') 能取到数据,请求中仍可能绕过缓存。关键不在 Composer,而在 APCu 自身行为:
-
apc.stat=0:设为1时,APCu 每次都会stat()检查文件修改时间,直接跳过缓存走文件查找;生产环境必须关 -
apc.enable_cli=1:CLI 下执行composer dump-autoload --apcu需要写入缓存,否则生成阶段就失败;很多 Docker 镜像默认为0 -
apc.shm_size:小项目 32M 可能够用,但含大量 vendor 包时(如 Laravel + dozens of packages),映射序列化后常超 50MB;设太小会导致apcu_store()静默失败
为什么 CLI 下测不到 APCu autoloader 加速效果?
不是配置错了,是机制使然:APCu 用户缓存在 CLI 模式下每个进程独立,而 php -r "new Foo();" 这类单次调用一启即毁,缓存写入后立即丢失。真正生效场景是 PHP-FPM worker 或 Apache mod_php —— 多个请求复用同一进程,共享内存才起作用。
验证是否真生效,别在 CLI 测:
- 在 Web 请求中执行:
php -r "var_dump(apcu_fetch('composer-apcu-autoloader-' . substr(md5(file_get_contents('vendor/composer/autoload_static.php')), 0, 8)));",返回非false才算写入成功 - 用
strace -e trace=openat php public/index.php 2>&1 | grep -c 'autoload'对比开启前后openat系统调用次数,下降明显说明命中缓存 - 注意:FPM 和 CLI 的
php.ini往往不同,用phpinfo()或php -i | grep 'Loaded Configuration File'分别确认
classmap-authoritative 模式下 APCu 缓存失效的隐性风险
启用 --classmap-authoritative 后,ClassLoader 彻底跳过所有 file_exists() 和 PSR-4 字符串匹配,只查 classmap 表。此时 APCu 缓存的其实是这张表的副本 —— 看似冗余,实则关键:它让“查表”这一步从 PHP 数组遍历变成共享内存哈希查找,毫秒级变微秒级。
但风险在于:
- 新增类后没重跑
composer dump-autoload --optimize --apcu→ APCu 里没新类,classmap 表里也没有 → 直接Class not found,不会 fallback - 缓存 key 基于
autoload_static.php内容哈希,只要 composer.json autoload 段不变,缓存就长期有效;但一旦改了命名空间映射,旧缓存不会自动失效,得手动apcu_clear_cache('user') - APCu 缓存本身不过期(
apc.ttl=0是常见设置),所以部署新代码后,光清 OPcache 不够,还得清 APCu 用户缓存
apc.enable_cli=1 和 apc.stat=0 这两个开关是否在对应 SAPI 下同时生效。











