换源不解决OOM,因Resolving dependencies阶段需全量加载依赖图,内存峰值常超1.5GB;必须用php -d memory_limit=2G前置设置,并配合--no-dev -o降内存。

镜像源同步本身不耗内存,真正崩的是依赖解析阶段——换源只是让下载变快,但composer install卡在Resolving dependencies时,PHP 还在用 128M 内存硬扛整个依赖图谱。
为什么换源后 still OOM?
换源(比如设成腾讯云或阿里云镜像)只加速包下载和元数据拉取,不跳过依赖求解。Composer 的 SAT 求解器必须把所有版本约束、冲突规则、require-dev 包全部载入内存建图——这个过程峰值常超 1.5GB。你看到“Loading composer repositories”,那只是前奏;真正吃内存的是后续的Resolving dependencies,它根本不管你是从 packagist.org 还是镜像站拿的 JSON。
- 镜像源配置生效后,
composer install仍会读取本地composer.lock并完整重放依赖树,内存压力不变 -
composer update更危险:它会先丢弃 lock 文件,再从镜像站重新 fetch 全量元数据,等于两倍 IO + 一次全量解析 - 某些镜像(如旧版 phpcomposer.com)返回的包信息格式不规范,反而触发 Composer 更多次递归校验,推高内存
php -d memory_limit 必须写在最前面
这是最容易翻车的点:php -d参数只在 PHP 进程启动瞬间生效,一旦进程起来,memory_limit 就锁死。很多同学写成 composer install -d memory_limit=-1 或 COMPOSER_MEMORY_LIMIT=-1 composer install,结果毫无作用。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- Linux/macOS 正确写法:
php -d memory_limit=2G composer install - PowerShell(Windows)必须加引号:
php -d "memory_limit=-1" composer install,否则-1被当命令参数截断 - 用
composer.phar时顺序不能变:php -d memory_limit=2G ./composer.phar install - 单位必须大写:
2G有效,2g被 PHP 完全忽略
--no-dev 和 -o 是真·降内存组合
开发依赖(phpunit、phpstan、laravel/pint)不是“可选”,而是被 Composer 当作完整依赖图的一部分参与求解。它们的 composer.json 常含复杂约束,拖慢解析且抬高内存峰值。
-
--no-dev直接跳过所有require-dev包的加载与校验,内存常降 40%~60% -
-o(即--optimize-autoloader)生成 classmap,避免 PSR-4 动态扫描,dump-autoload 阶段不再爆内存 - 上线部署推荐组合:
php -d memory_limit=1.5G composer install --no-dev -o - CI 流水线更进一步:
--classmap-authoritative可配合-o关闭动态查找,彻底杜绝 autoload 引发的额外开销
Docker 和 CI 环境要双重设限
光调 PHP 的 memory_limit 不够——容器或构建节点本身内存不足,PHP 即使设了 -1 也会被 OOM Killer 杀掉,且无错误日志。
- Docker 运行时需显式分配内存:
docker run --memory=4g ...,否则默认可能只有 2GB(尤其 Docker Desktop for Mac) - GitHub Actions 默认容器总内存约 7GB,但设
memory_limit=-1容易因单次异常占满全部,推荐php -d memory_limit=2G - GitLab CI 中若禁用
-d参数(常见于安全策略),必须兜底:COMPOSER_MEMORY_LIMIT=1536M+php -d memory_limit=2G双保险 - 验证是否真生效:
php -r "echo ini_get('memory_limit');",别信php --ini显示的路径,要测运行时值
最常被忽略的是:composer.lock 文件体积本身会影响解析内存。一个含大量 dev-master 哈希、废弃包残留的 lock 文件,可能比空 lock 多耗 300MB 内存。删干净再装,比硬提内存更治本。

















