composer install 是生产环境的正确选择,因其严格按 composer.lock 安装,确保版本锁定、可复现且无意外升级;而 composer update 会重算依赖树并修改 lock 文件,主动引入变更风险。

为什么 composer install 才是生产环境的正确选择
因为 composer install 严格按 composer.lock 安装,版本锁定、可复现、无意外升级。而 composer update 会重算依赖树、写入新 composer.lock,生产环境一旦执行就等于主动引入变更风险。
常见错误现象:composer update 被误提交进生产部署脚本;本地开发删了 composer.lock 后直接 composer install,结果报错“lock file is not up to date”。
- 必须确保 CI/CD 或部署脚本中只调用
composer install --no-dev --optimize-autoloader -
--no-dev禁用require-dev里的包(如 PHPUnit、phpstan),避免生产环境多装一堆调试工具 -
--optimize-autoloader生成扁平化类映射,减少文件系统查找开销,对 APCu/XCache 友好
部署前必须校验 composer.lock 和 composer.json 的一致性
不一致会导致 composer install 拒绝执行,并抛出明确错误:Your lock file does not contain the required package... 或 Lock file operations: 1 install, 0 updates, 0 removals 这种提示其实是警告——说明 composer.lock 没反映当前 composer.json 的真实需求。
使用场景:多人协作时有人改了 composer.json 但忘了 composer update 提交新 composer.lock;或从 Git 分支切换后未同步 lock 文件。
- CI 流水线第一行建议加:
composer validate --strict,它会检查 JSON 格式、字段合法性,以及composer.lock是否与composer.json匹配 - 本地开发完成修改后,运行
composer update --dry-run快速预览是否真有变更,再决定是否提交 lock - Git 提交前确认
composer.lock在暂存区:git status应显示它被修改且已 stage,否则部署大概率失败
composer install 在容器或无交互环境下的关键参数
CI/CD、Docker 构建或某些 SSH 部署环境默认没有 TTY,composer install 可能卡在“是否启用插件”或“是否跳过平台检查”等交互提示上,导致构建挂起。
性能影响:不加 --no-interaction 会让 Composer 在非交互终端下尝试读取 stdin,超时后才 fallback,白白浪费 3–5 秒。
- 必加
--no-interaction(可简写为-n),关闭所有用户输入请求 - 若项目依赖扩展如
ext-gd,但构建机没装,加--ignore-platform-reqs可跳过检查——但仅限临时调试,生产镜像应提前装好扩展 - Dockerfile 中推荐写法:
RUN composer install --no-dev --optimize-autoloader --no-interaction
缓存失效和 vendor 目录残留引发的静默问题
Composer 缓存(~/.composer/cache)本身不会导致安装失败,但若缓存里存了损坏的 zip 包或旧版元数据,可能让 composer install 解压出错,报类似 ZipArchive::extractTo(): No such file or directory 的错误,且不提示具体哪个包。
容易踩的坑:每次部署都 rm -rf vendor && composer install,看似干净,实则放弃 Composer 的增量更新能力,拖慢构建速度;更糟的是,如果 vendor 没清干净(比如权限问题导致部分目录残留),Composer 可能跳过重装某些包,造成行为不一致。
- CI 环境建议用
--no-cache参数彻底绕过本地缓存,确保每次都是干净拉取 - 部署脚本里不要手动
rm -rf vendor,改用composer install --no-dev --optimize-autoloader --no-interaction --clean-install(Composer 2.2+ 支持) - 若遇到诡异的类找不到或方法不存在,先试
composer dump-autoload --optimize,比重装更快,也更安全
真正麻烦的是 lock 文件里某个包指定了 dist 类型但源已不可达,而 Composer 默认又启用了 packagist.org 回退机制——这种故障往往只在特定网络环境下暴露,测试环境跑得通,上线就崩。










