生产环境绝不能用 composer update,因其会无视 composer.lock 重新解析版本约束,导致依赖升级不一致、PHP 扩展缺失报错;必须用 composer install --no-dev --optimize-autoloader --classmap-authoritative,并确保 composer.lock 已提交且无换行符问题。

生产环境部署必须用 composer install --no-dev,且确保 composer.lock 已提交到 Git;直接跑 composer update 或漏掉 --no-dev 是线上事故高发原因。
为什么部署时不能用 composer update
它会重新解析 composer.json 中所有版本约束,跳过 composer.lock 的锁定记录,导致实际安装的包版本与开发、测试环境不一致。比如本地 guzzlehttp/guzzle 锁定在 7.5.1,update 后可能升到 7.8.0,而该版本依赖的 PHP 扩展或函数在生产机上缺失,直接报 Fatal error: Uncaught Error: Call to undefined function GuzzleHttp\Promise\curl_init()。
常见错误现象:
- CI 流水线里写
composer update && composer install—— 多此一举,且破坏 lock 文件一致性 - 运维同学手动在服务器上执行
composer update修复“某个包没装好”,结果连带升级了symfony/console,导致自定义命令的configure()方法签名不兼容
composer install 必须配合 --no-dev
开发期依赖(如 phpunit/phpunit、roave/security-advisories)不仅体积大(PHPUnit 单独超 20MB),还可能引入危险功能:比如 symfony/var-dumper 在生产环境暴露完整对象结构,phpstan/phpstan 加载大量反射类拖慢启动。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
正确做法:
- 上线前确认
composer.json中的require-dev字段只含真正开发工具 - 部署脚本中明确写死:
composer install --no-dev --optimize-autoloader --classmap-authoritative - CI 构建镜像时,先
rm -rf vendor再执行上述命令,避免残留旧包干扰
如何验证部署后的依赖状态
别只看 vendor/ 目录是否存在——那可能是上次遗留的。关键要检查三件事:
- 运行
composer show --installed,确认列出的包版本和composer.lock中packages节点完全一致 - 检查
vendor/autoload.php是否可被正常require,且不抛出Warning: require(.../autoload_real.php): failed to open stream - 若项目用了 PSR-4 自动加载,执行
composer dump-autoload --classmap-authoritative后再验证类能否实例化,避免因配置错误导致Class not found
最容易被忽略的是 composer.lock 文件权限和换行符:Windows 下编辑过该文件可能导致 Git 提交时 CRLF 换行,Linux 部署机解析失败,报 file_get_contents(): Failed to enable crypto 类似错误。始终用 git config core.autocrlf input 统一处理。

















