需手动执行 composer dump-autoload -o 更新 autoload 缓存,否则新增类因映射未生成而报 class not found;-o 同时处理 autoload 和 autoload-dev,生成优化后的静态映射文件。

autoload.php 缓存没更新,新类死活找不到
Composer 不会自动监听文件变化并刷新 vendor/autoload.php,新增类后直接跑代码报 Class not found 是常态,不是你路径写错了,是映射根本没生成。
根本原因是:Composer 只在 composer install 或 composer update 时全量重写 autoload 映射;而日常开发中只改了 psr-4 下的源码,没动依赖,自然不会触发重建。
- 别试
composer dump-autoload --no-scripts—— 它只是重新生成映射,但默认不优化(即不合并成单文件),加载仍慢,且容易漏掉 dev-autoloading 配置 - 日常新增类后,用
composer dump-autoload -o(-o表示 optimize):它会把 PSR-4/PSR-0 映射编译进vendor/composer/autoload_classmap.php,同时生成更紧凑的autoload_static.php - 如果项目启用了
classmap或files加载方式,-o会一并扫描和固化,但要注意:classmap 扫描的是指定目录下的所有 PHP 文件,不是按命名空间匹配的,加了新文件就得重 dump
dev-autoloading 配置被忽略?检查 composer.json 的 autoload-dev
测试类(比如 tests/MyTest.php)常放在 autoload-dev 里,但很多人只改了 autoload 段,忘了 dev 段也要同步 dump。
composer dump-autoload 默认只处理 autoload,除非显式加 --dev 或启用 --optimize(-o 会自动包含 dev 配置)。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 运行
composer dump-autoload -o后,检查vendor/composer/autoload_psr4.php和autoload_namespaces.php是否包含了你的 dev 命名空间 - 若用
files加载全局函数(如tests/helpers.php),必须确保autoload-dev.files已声明,且dump-autoload执行时未加--no-dev - CI 环境常见坑:脚本里写了
composer install --no-dev,结果本地能跑的测试类在 CI 报错——因为autoload-dev根本没进缓存
为什么加了 -o 还加载慢?可能是 classmap 冲突或 require_once 泛滥
-o 生成的静态映射理论上最快,但实际加载变慢,往往是因为 classmap 和 PSR-4 规则重叠,导致 Composer 在查找时多走分支,或者你的代码里大量 require_once 手动引入,绕过了 autoloader。
- 检查
composer.json中是否同时配置了psr-4和classmap指向同一目录(例如都指向src/)——这会让 Composer 对每个类名做两次判断,性能反降 - 用
composer show -s查看当前生效的 autoload 规则,确认没有重复或覆盖 - 如果项目里存在大量
require_once 'SomeClass.php',它们不会被 autoload 缓存加速,还会引发文件重复加载警告;应统一改用new SomeClass()或class_exists()触发自动加载
Git 提交后 CI 报 Class not found?别忘提交 vendor/composer/*.php
很多人以为 vendor/ 不该进 Git,于是把整个目录加进 .gitignore,但忽略了:vendor/composer/autoload_*.php 是构建产物,不是第三方代码,它依赖于你本地的 composer.json 和文件结构。
CI 拉代码后执行 composer install,会根据 lock 文件还原依赖,但不会重新 dump autoload——除非你显式加了 --no-cache 或删了 vendor 目录再装。而默认行为是复用已有的 autoload 文件,一旦它们过期,就崩。
- 最稳做法:CI 脚本里加一步
composer dump-autoload -o --no-dev(生产环境去掉--dev) - 如果团队用 Docker,确保构建镜像时执行了
dump-autoload,而不是只靠composer install - 别信 “lock 文件保证一致性”——它只管依赖版本,不管你的新类有没有被映射进去
autoload 缓存不是黑盒,它是静态快照;每次类文件增删、命名空间调整、composer.json 修改,只要影响了映射逻辑,就得手动 dump-autoload -o。没人替你盯这个。










