composer install 不等于更新,它只按 composer.lock 精确还原依赖,忽略 composer.json 所有变更;真正更新依赖必须用 composer update,它重算依赖树并生成新 lock 文件,但需配合服务重启才能生效。

不能。 composer install 本身不更新依赖,它只还原已锁定的状态;所谓“平滑更新”,实际发生在 composer update 阶段,而该操作必然修改 composer.lock,与“不重启服务”存在根本冲突。
为什么 composer install 不等于“更新”
它完全忽略 composer.json 的任何变更(新增/删包、改版本约束、PHP 版本要求),只忠实地把 vendor/ 目录对齐到 composer.lock 记录的精确哈希和版本。你改了 composer.json 后跑 composer install,它要么报错(lock 与 json 不兼容),要么静默忽略你的修改——根本不会装新东西。
- 常见误判:看到
composer install输出 “Installing dependencies from lock file”,就以为它在“升级”,其实它连 Packagist 都没连一次 - CI/CD 中唯一安全动作:
composer install --locked,一旦composer.lock缺失或与composer.json冲突,立刻失败,杜绝隐性漂移 - 所谓“平滑”,靠的是提前验证过的
composer.lock文件,不是靠 install 命令本身
真正能触发依赖变更的操作只有 composer update
它重算整棵依赖树,生成新 composer.lock,这才是实际的“更新”行为。但这个过程无法绕过服务重启,原因很实在:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- PHP 进程已加载旧类(比如
Illuminate\Support\Str的某个方法被 opcode 缓存),新版本类结构变了,不 reload 就用不上 - 框架缓存(如 Laravel 的
bootstrap/cache/config.php)是基于旧依赖生成的,不清缓存 + 重启,配置可能错乱 - Composer 自动加载器(
vendor/autoload.php)注册的是旧路径映射,新增/删类不会自动生效
生产环境“不重启”的可行路径只有两个
它们都绕不开 composer update 的前置工作,但把风险控制在部署前:
- 在 CI 环境中运行
composer update --with-dependencies laravel/framework,确认git diff composer.lock只有预期变更,再提交新composer.lock - 上线时只执行
composer install --locked+ 清应用缓存(php artisan config:clear等)+ 优雅重启(如systemctl reload php-fpm或滚动重启 Worker) - 零停机关键不在 Composer,而在应用层:Laravel 的队列监听器、WebSocket 连接、长连接 HTTP 服务,这些必须自己实现 graceful shutdown,否则即使 lock 没变,也会丢请求
真正容易被忽略的点是:很多人把“不改代码就能热更”当成目标,但 PHP 的类加载机制和进程模型决定了,只要依赖的公共接口(方法签名、返回类型、事件契约)变了,就必须让新进程加载新类。Composer 能做的只是确保新进程装对东西,而不是让旧进程理解新东西。










