应优先调高 PHP CLI 的 memory_limit 而非添加 SWAP;正确命令为 php -d memory_limit=2G composer install,单位必须是 G,顺序不可颠倒,且需确认 composer 是否为 shell wrapper。

别加 SWAP,它会让 Composer 更慢、更卡,甚至直接失败。 Composer 报 Allowed memory size exhausted,根本不是系统物理内存不够,而是 PHP CLI 进程被自己的 memory_limit 拦住了——调高它,问题当场消失;加 SWAP 只会把 I/O 压力拉满,拖垮整个安装流程。
php -d memory_limit=2G 是唯一该先试的命令
这个命令直接绕过所有配置文件,只作用于当前 Composer 进程,干净、可控、不污染环境:
- 单位必须是
G(不是GB或M),2G是 CI 环境大规模验证过的稳妥值 - 顺序不能错:
php -d memory_limit=2G composer install,写成composer install -d memory_limit=2G会被忽略 - Linux/macOS 直接执行即可;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
COMPOSER_MEMORY_LIMIT 环境变量不解决根本问题
这个变量只控制 Composer 自身逻辑(比如依赖求解器缓存大小),完全不绕过 PHP 的 memory_limit 底层限制:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- PHP 进程在分配第 129MB 内存时就被内核 kill,Composer 根本没机会读到这个变量
- Linux/macOS 正确写法:
COMPOSER_MEMORY_LIMIT=2G composer install(等号前后不能有空格) - Windows CMD:
set COMPOSER_MEMORY_LIMIT=2G && composer install - PowerShell:
$env:COMPOSER_MEMORY_LIMIT="2G"; composer install - 它对
composer install几乎无效,因解包和软链由 PHP 直接操作;对composer update有轻微缓解,但前提是 PHP 层已放开到足够大
为什么 composer update 比 install 更容易爆内存
composer update 要在单个 PHP 进程里做 SAT(布尔可满足性)求解:尝试成百上千种版本组合、反复回溯、验证冲突,内存消耗呈指数级增长;而 composer install 只是按 composer.lock 精确还原,开销小得多:
- 日常开发优先用
composer install,不是update - 真要升级,缩小范围:
composer update monolog/monolog guzzlehttp/guzzle,避免全量重算 - 收紧
composer.json中的版本约束,比如把"^1.0 || ^2.0"改成"^2.9",大幅减少 solver 探索空间 -
--no-dev和--optimize-autoloader对 solver 阶段基本没用,它们只影响后期 autoload 生成
真正容易被忽略的点是:你以为在调 Composer,其实可能根本没调到 PHP。先跑 php -r "echo ini_get('memory_limit');" 看 CLI 模式真实限制,再用 ls -l $(which composer) 确认它是不是 shell wrapper —— 这两步不走,后面所有操作都是在猜。

















