php -d memory_limit=2g 是解决 composer 内存耗尽的首选方案,仅作用于当前命令,单位必须为 g,顺序不可颠倒,windows powershell 需加引号,低配 vps 应配置 1gb swap,composer_memory_limit 仅为辅助防护,不能替代 php 的 memory_limit 设置。

php -d memory_limit 是第一道关,不是可选项
Composer 报 Allowed memory size exhausted,95% 的情况根本不是系统内存不够,而是 PHP CLI 进程被自己的 memory_limit 拦住了。默认 128M 或 256M 在解析依赖树、加载元数据时瞬间打满。
直接加参数是最干净的解法:php -d memory_limit=2G composer install。它只作用于当前命令,不改配置、不污染环境、不重启服务。
- 单位必须是
G(不是GB或M),2G是 CI 环境大规模验证过的稳妥值 - 顺序不能颠倒:写成
composer install -d memory_limit=2G会被忽略 - Windows PowerShell 用户必须加引号:
php -d "memory_limit=2G" composer install - 如果
which composer返回的是/usr/bin/composer(Ubuntu 的 shell wrapper),得用绝对路径:php -d memory_limit=2G /usr/bin/composer install
“Killed” 不是报错,是 Linux 内核在杀人
终端只输出 Killed,没堆栈、没错误码?那基本是 Linux OOM Killer 干的——物理内存 + Swap 总和耗尽,内核强制杀掉占用最多的进程(通常是 PHP)。
执行 swapon --show 或 free -m | grep Swap,如果没输出,说明 Swap 确实没开。这时候光调 memory_limit 没用,PHP 进程还没来得及报错就被干掉了。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 低配 VPS(如 512MB RAM)建议建 1GB Swap:
sudo fallocate -l 1g /swapfile && sudo mkswap /swapfile && sudo swapon /swapfile - fallocate 失败时换
dd:sudo dd if=/dev/zero of=/swapfile bs=1M count=1024 - 别盲目加到 2GB 以上,I/O 压力会拖慢 Composer 启动,1024M 是实测平衡点
COMPOSER_MEMORY_LIMIT 是第二层防护,不是替代方案
这个环境变量只控制 Composer 自身逻辑(比如依赖求解器缓存大小),完全不绕过 PHP 底层的 memory_limit。哪怕设了 COMPOSER_MEMORY_LIMIT=-1,只要 PHP 进程本身被 memory_limit=128M 截断,照样报错。
它适合做“二次防护”,配合 php -d 使用更稳妥:
- Linux/macOS:
COMPOSER_MEMORY_LIMIT=2G php -d memory_limit=2G composer update - Windows CMD:
set COMPOSER_MEMORY_LIMIT=2G && php -d memory_limit=2G composer install - PowerShell:
$env:COMPOSER_MEMORY_LIMIT="2G"; php -d memory_limit=2G composer install
镜像源和参数组合能减压,但救不了 solver 阶段
换国内镜像(如阿里云 https://mirrors.aliyun.com/composer/)主要解决下载慢、Content-Length mismatch 等网络问题,对内存峰值影响有限。真正能降 solver 内存压力的是收紧约束:
-
--no-dev跳过 dev 包安装,但 solver 阶段仍要遍历所有版本组合 -
--optimize-autoloader只影响 autoload 生成阶段,不缓解前期解析 - 把
"monolog/monolog": "^1.0 || ^2.0"改成"^2.9",大幅缩小 solver 探索空间 - 删掉不用的
require-dev条目——它们参与依赖图构建,哪怕不装
最容易被忽略的一点:你以为在调 Composer,其实可能根本没调到 PHP。先跑 php -r "echo ini_get('memory_limit');" 看 CLI 模式真实限制,再用 ls -l $(which composer) 确认它是不是 shell wrapper —— 这两步不走,后面所有操作都是在猜。










