dump-autoload 在执行后立即生效,但仅更新自动加载映射文件(如 autoload_classmap.php),不改变运行时加载逻辑;真正提速需配合 --optimize、禁用 opcache 的 stat 检查及重启 web 服务器。

dump-autoload 什么时候才真正生效?
它只影响 autoload.php 的生成逻辑,不改变运行时类加载行为本身。换句话说:执行完 composer dump-autoload 后,PHP 还是靠 ClassLoader::findFile() 去磁盘找文件,只是映射表(如 classmap)或命名空间前缀规则(psr-4)被重新整理了。
常见错误现象:Class not found 错误在改完 composer.json 后依然存在,不是因为没执行 dump,而是因为没加 --optimize 或没清空 OPCache —— 后者常被忽略。
- 开发阶段改了
psr-4映射或新增了files类型自动加载,必须执行composer dump-autoload才能让新规则进autoload_static.php - 上线前想提速,要加
--optimize(即生成classmap),否则默认只是重写规则,几乎不提升性能 -
--classmap-authoritative能彻底跳过文件系统扫描,但要求所有类都得在 classmap 里,漏一个就报错,适合打包部署后使用
classmap 模式比 PSR-4 快多少?
快在“免扫描”——PSR-4 每次加载类都要按命名空间层层拼路径、检查文件是否存在;classmap 是个大数组,isset($map[$class]) 一下就出结果,O(1) 查找。
但代价是:classmap 生成慢、体积大、不支持动态增删类(比如测试时用 eval() 注入的类不会进 map)。实际项目中,classmap 对首次请求加速明显,后续有 OPCache 缓存 opcode 后差距收窄。
- 执行
composer dump-autoload --optimize会扫描vendor/和你配置的autoload.classmap目录,生成扁平化映射 - 如果项目里混用了 PSR-4 和 classmap,
composer dump-autoload --optimize --classmap-authoritative会让 PSR-4 规则失效,只认 classmap,务必确认全覆盖 - CI/CD 中建议加
--no-dev,避免把tests/目录也扫进去,徒增 classmap 体积和生成时间
为什么 dump-autoload 后类还是找不到?
大概率不是命令没起作用,而是路径或命名没对齐。Composer 的 autoload 机制很“老实”,它只认 composer.json 里写的路径,不猜、不递归、不自动补 src/。
典型错误:把 "App\": "app/" 写成 "App\": "app"(少斜杠),或类文件名与类名大小写不一致(Linux 下直接失败)。
- 检查
vendor/composer/autoload_psr4.php里对应前缀是否已更新,确认键值对和路径末尾斜杠 - 用
composer dump-autoload -v看详细输出,它会列出扫描了哪些目录、跳过了哪些(比如被.gitignore挡住的) - 如果用了 symlink(如
composer install --no-dev --prefer-dist后又手动软链),确保dump-autoload在 symlink 已就位后再执行
OPCache 和 dump-autoload 怎么配合才不白干?
哪怕你生成了最优化的 classmap,如果 OPCache 没禁用 file_exists 检查,它还是会去磁盘验证文件修改时间——这就把 classmap 的 O(1) 优势抵消了一半。
关键配置是 opcache.enable_file_override=1(允许 OPCache 覆盖文件系统调用)和 opcache.stat=0(关掉运行时文件状态检查)。否则每次请求仍会触发大量 stat() 系统调用。
-
composer dump-autoload --optimize生成的autoload_classmap.php是纯 PHP 数组,OPCache 能完整缓存,但前提是 PHP 配置允许 - 本地开发用
opcache.stat=1方便调试,但上线必须关掉,否则dump-autoload做的优化基本白费 - 改完 OPCache 配置记得重启 PHP-FPM 或 Apache,光 reload 不够
classmap 文件体积和 OPCache 内存占用成正比,上万类的项目要注意 opcache.memory_consumption 是否够用,不然会静默降级回非缓存模式。











