根本原因是未启用 --no-dev、--optimize-autoloader 和 --no-interaction,且本地缓存未生效或 PHP 扩展缺失;需确保缓存路径可写、zip/zlib 扩展启用,并在 CI/CD 中复用缓存。

为什么 composer install 在生产环境特别慢
根本原因不是网络差,而是默认会装开发依赖、反复解析版本、重复下载包。生产环境根本用不到 phpunit、friendsofphp/php-cs-fixer 这些,但 Composer 仍会拉取、解压、执行 autoload 生成逻辑。
- 开发依赖通常占总包体积 40%–70%,尤其含二进制工具(如
phpstan)时更拖慢 -
composer.lock里没锁定平台配置(如 PHP 版本、扩展),导致每次都要重新分析兼容性 - 没启用本地缓存,同一台机器多次部署,相同 ZIP 包仍重复下载解压
--no-dev 必须加,但光加它还不够
加 --no-dev 能跳过 require-dev 下的所有包,节省大量时间,但它不解决“重复解析”和“缓存缺失”问题。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 必须配合
--optimize-autoloader(简写-o),否则自动加载仍走未优化的 PSR-4 映射,启动慢且安装时生成映射也耗时 - 不能只在命令行加,CI/CD 脚本或部署脚本里漏掉就白搭;建议写死为:
composer install --no-dev --optimize-autoloader --no-interaction -
--no-interaction防止因缺少 TTY 或交互提示卡住,尤其 Docker 构建或无终端部署场景
本地缓存怎么开才真正生效
Composer 默认开启缓存,但很多人没确认缓存路径是否可写,或被 CI 环境清空了。
- 查当前缓存位置:
composer config --global cache-dir,常见是~/.composer/cache - 确保部署用户对该目录有读写权限,Docker 中常需提前
RUN chown -R www-data:www-data /root/.composer/cache - CI 环境(如 GitHub Actions)要显式复用缓存,用
actions/cache缓存~/.composer/cache路径,否则每次都是冷启动 - 缓存对
dist包(ZIP/TAR)有效,对source(git clone)无效——所以别在composer.json里写"type": "package"+"source",那会绕过缓存
PHP 扩展缺失导致反复重装
如果 ext-zip 或 ext-zlib 没启用,Composer 会退回到慢得多的 PHP 解压逻辑,甚至失败后重试三次,看起来像卡死。
- 运行
php -m | grep -E 'zip|zlib'确认扩展已加载 - Docker 用户注意:Alpine 镜像默认不带
ext-zip,需额外装apk add php7-zip并在php.ini启用 - Mac M1 用户用 Homebrew 装的 PHP,有时
ext-zip编译失败,表现为Failed to initialize zip module错误,得重装 PHP 带 zip 支持
--no-dev 是否真被传进子进程(比如被 Makefile 或 shell wrapper 截断),这三处最容易被当成“网络问题”忽略。

















