应使用 php -d memory_limit=2G 或 COMPOSER_MEMORY_LIMIT=2G 限制内存,前者优先级更高且控制所有子进程;composer config memory-limit 无效,因该命令不存在。

Composer 运行报 Allowed memory size exhausted 怎么办
Composer 默认不限制内存,遇到大项目(如 Laravel + 大量插件)容易因 PHP 内存溢出中断。这不是 Composer 本身的问题,而是它调用的 PHP 进程超限——所以得从 PHP 层面控制,不是 Composer 自带某个 memory_limit 配置项。
三种生效的内存限制方式,按优先级排序
实际生效顺序:命令行参数 > php.ini 临时设置 > 系统级 php.ini。推荐用前两种,避免污染全局配置。
- 运行时加
-d memory_limit=2G(最常用、最安全):php -d memory_limit=2G /usr/local/bin/composer install
- 用
COMPOSER_MEMORY_LIMIT环境变量(Composer 原生支持):COMPOSER_MEMORY_LIMIT=2G composer install
设为-1表示不限制,0表示使用 php.ini 当前值 - 改
php.ini的memory_limit(不推荐用于共享环境):
找到 CLI 模式的 php.ini(常是/etc/php/*/cli/php.ini或php --ini查看),改memory_limit = 2G
COMPOSER_MEMORY_LIMIT 和 php -d 的关键区别
两者都能起作用,但行为不同:
-
COMPOSER_MEMORY_LIMIT只影响 Composer 主进程,不控制它 fork 出的子进程(比如某些插件执行脚本时仍可能爆内存) -
php -d memory_limit=...是启动 PHP 解释器时硬性设定,所有后续执行(包括 require 的第三方脚本)都受约束,更彻底 - 如果同时设了两者,
php -d优先级更高,COMPOSER_MEMORY_LIMIT会被忽略
为什么 composer config memory-limit 不起作用
这个命令根本不存在。Composer 的 config 命令不支持 memory-limit,网上很多教程写的 composer config -g memory-limit -1 是错的——执行后既不报错也不生效,纯属误导。真正有效的只有上面提到的环境变量或 PHP 启动参数。
复杂点在于:有些 CI 环境(如 GitHub Actions)默认内存紧张,且可能禁用 php -d 参数;这时候必须用 COMPOSER_MEMORY_LIMIT,并确认 runner 的 PHP CLI 版本和 ini 加载路径是否一致。










