composer.lock 是依赖快照,记录精确版本、下载地址、sha256校验值及依赖子树;vendor/autoload.php 是自动加载入口,仅加载 composer.json 中明确定义的 psr-4/psr-0/classmap/files;installed.json 存运行时元数据,供 show/why 等命令读取;autoload_*.php 是由 autoload 规则编译生成的具体加载逻辑。

composer.lock 是快照,不是缓存
它不是临时产物,也不能随便删。一旦存在,composer install 就只认它,完全忽略 composer.json 里的 ^、~ 或其他版本约束。这个文件里记录的是:每个包的精确版本号、dist/source 下载地址、SHA256 校验值,以及该包自己的 require 子树(即它的依赖链)。CI 构建失败常因它缺失或损坏——此时 install 会退化成 update 行为,重新解析约束,结果不可控。
vendor/autoload.php 是自动加载入口,但不是“万能加载器”
它由 Composer 自动生成,负责把 PSR-4、PSR-0、classmap 和 files 四类声明映射到实际文件路径。但注意:autoload.php 不会自动加载任意 PHP 文件,只加载你在 composer.json 的 autoload 或 autoload-dev 字段里明确定义的部分。常见错误包括:
- 忘记在
composer.json中配置"autoload": {"psr-4": {"App\": "src/"}},就直接use AppFoo—— 类找不到 - 修改了目录结构后没运行
composer dump-autoload,导致新类不生效 - 把测试用的 helper 函数写在
files数组里,却误放在autoload-dev中,生产环境install --no-dev后函数不可用
vendor/composer/installed.json 记录已安装包的实时状态
这是 composer install 过程中生成的运行时元数据,内容来自 composer.lock 解析后的扁平化结果。它被 composer show、composer why 等命令直接读取。关键点:
- 它不包含校验值或依赖树,只存包名、版本、类型、安装路径和 require 列表(不含嵌套)
- 每次
install或update都会重写它,但不会校验内容一致性 —— 所以手动篡改 vendor 目录后,它可能和实际文件不匹配 -
composer show monolog/monolog查到的版本,就是从这个文件里读的,不是从composer.lock实时解析的
vendor/composer/autoload_*.php 是具体加载逻辑的实现文件
这些是 PHP 脚本,不是配置。Composer 把你在 composer.json 中声明的 autoload 规则,编译成一堆 autoload_static.php、autoload_classmap.php 等文件。它们被 autoload.php 引入并执行。容易忽略的细节:
- PSR-4 映射最终转成一个静态数组,按命名空间前缀做字符串前缀匹配 —— 所以
"App\": "src/"不能写成"App\"少斜杠,否则匹配失败 - classmap 是通过扫描生成的,但只扫
composer.json里autoload.classmap指定的路径,不会递归子目录,除非显式列出 - 如果项目用了插件(如
hirak/prestissimo),这些 autoload_*.php 文件仍会被生成,但加载流程可能被拦截或增强,调试时需留意
composer.lock 与 vendor/ 不一致、或 installed.json 与磁盘文件脱节时,报错信息往往不指向真实原因。











