composer install是Laravel项目启动和部署的唯一安全入口,必须使用:它按composer.lock精确还原已验证依赖,不升级、不重算;而update会忽略lock文件导致不兼容;生产环境须加--no-dev --optimize-autoloader确保安全与性能。

composer install 是 Laravel 项目启动和部署的唯一安全入口,不是“可以选”,而是“必须用”。它不装新包、不升级版本、不重算依赖树——只按 composer.lock 精确还原已验证过的依赖状态。
为什么新拉下来的 Laravel 项目必须 run composer install,而不是 update
执行 composer update 会忽略 composer.lock,重新解析 composer.json 并拉取满足约束的最新兼容版本。Laravel 9+ 项目里,symfony/console 从 v6 升到 v7 可能直接让 php artisan 报 Class not found;monolog/monolog 小版本跳变也可能破坏日志通道绑定逻辑。
而 composer install 的行为是确定性的:
- 有
composer.lock→ 严格安装其中记录的每个包的完整哈希与版本 - 没有
composer.lock→ 退化为按composer.json安装,并自动生成新的 lock 文件(仅限首次初始化) - lock 文件存在但内容过期?install 不会主动更新它,也不会警告你——它只忠实地还原
生产部署时加 --no-dev --optimize-autoloader 是刚需,不是可选项
在 CI/CD 或上线服务器上漏掉这两个参数,等于把开发环境搬进生产:
-
--no-dev:跳过require-dev里的所有包(如phpunit/phpunit、laravel/pint、mockery/mockery),减少 vendor 体积 30%–50%,避免 dev-only 类被意外加载引发权限或性能问题 -
--optimize-autoloader(简写-o):生成vendor/composer/autoload_classmap.php,把 PSR-4 映射转成静态数组,类加载从文件扫描降为 O(1) 查表,实测请求耗时下降 8–12%
正确命令是:composer install --no-dev --optimize-autoloader。少一个参数,就多一分不可控。
vendor/autoload.php 不是你 require 的,但你得知道它怎么来的
Laravel 入口 public/index.php 第一行就是 require __DIR__.'/../vendor/autoload.php';。这个文件由 Composer 自动生成,但它不会自动刷新——哪怕你刚在 composer.json 的 autoload 段加了一条 psr-4 映射,或者新增了 app/Helpers/functions.php 并写进 autoload.files。
此时必须手动触发:composer dump-autoload -o
- 不加
-o:只刷新 PSR-4/PSR-0 映射,不生成 classmap,对性能无提升 - 加
-o:同时生成 classmap + 优化 PSR-4 查找路径,推荐始终带上 -
dump-autoload不动 vendor、不改 lock、不重装包,纯属“刷新加载规则”,快且安全
缓存没配,install 再快也白跑两遍
很多人以为换镜像源就万事大吉,结果 composer install 在 CI 流水线里每次都要重下 ZIP 包。根本原因:缓存路径未启用或 TTL 过短。
检查并补全这两步:
- 运行
composer config -g cache-files-dir,若输出为空,说明缓存关闭。启用它:composer config -g cache-files-dir ~/.composer/cache/files - 设合理有效期:
composer config -g cache-files-ttl 3600(1 小时),太长会命中过期包,太短等于没缓存 - 验证是否生效:删掉
vendor/后再跑一次composer install -vvv,日志中出现Cache hit或Using cached才算真正走缓存
镜像源 + 缓存 + 正确参数,三者缺一,composer install 就只是“慢”,而不是“稳”。


















