php -d memory_limit=2G 必须置于 composer 命令最前以生效,COMPOSER_MEMORY_LIMIT 仅控制 Composer 内部调度,两者需同时设置;改 php.ini 易误改非 CLI 配置,应先用 php --ini 确认路径。

php -d memory_limit 参数必须加在 composer 命令最前面
直接运行 composer install 报 Allowed memory size exhausted,说明 PHP CLI 进程启动时内存不够。临时解决的唯一可靠方式,是让 php 进程本身加载时就带高内存限制——php -d memory_limit=2G 必须写在 composer 或 ./composer.phar 之前,否则参数不生效。
常见错误写法:./composer.phar install(没加 php -d,走系统默认 128M)composer.phar install(shell 可能找不到命令,或调用错 PHP 版本)
- Linux/macOS/Windows CMD:写成
php -d memory_limit=2G composer install(等号两边不能有空格) - PowerShell:必须加引号,
php -d "memory_limit=-1" composer update - 用了
composer.phar文件:必须是php -d memory_limit=2G ./composer.phar install,不能省略php -
-1表示无限制,本地开发可用;CI/CD 中建议写死为2G或3G,防 OOM killer 杀进程
COMPOSER_MEMORY_LIMIT 环境变量只影响 Composer 自身逻辑
这个变量不会改变 PHP 底层的 memory_limit,它只控制 Composer 内部组件(比如 SAT 求解器、元数据解析器)的预分配行为。优先级高于 php.ini,但低于 php -d。适合轻量调整或配合使用。
- Linux/macOS 临时生效:
export COMPOSER_MEMORY_LIMIT=2G && composer install - Windows CMD:
set COMPOSER_MEMORY_LIMIT=2G && composer install - CI 脚本推荐直接注入:
COMPOSER_MEMORY_LIMIT=2G composer install --no-interaction - 验证是否生效:
php -r "echo getenv('COMPOSER_MEMORY_LIMIT');",应输出2G - 别在
.env或phpunit.xml里设PHP_MEMORY_LIMIT——Composer 不读这些
为什么改 php.ini 经常白忙活
你改的很可能不是 CLI 模式用的配置文件。Web 服务器(如 PHP-FPM)和终端跑的 composer 通常加载完全不同的 php.ini。改了 Apache 的配置,对 php -v 或 composer 没任何影响。
- 先查 CLI 实际加载哪个:
php --ini,看 “Loaded Configuration File” 路径(常见于/etc/php/8.2/cli/php.ini) - 改完后验证:
php -r "echo ini_get('memory_limit');",输出应为2147483648或2G - Docker、GitHub Actions 等环境基本不允许改
php.ini,硬改会被覆盖或失败 - 全局调高
memory_limit有风险:一个失控脚本可能吃光整台服务器内存
install 卡住 ≠ 网络慢,很可能是内存不够
Resolving dependencies 阶段完全不走网络,但会高频扫描 vendor/ 和项目目录下的所有 PHP 文件。一旦内存不足,Composer 就会反复重试、静默崩溃,甚至被系统 Killed(日志里只剩这个词,没有堆栈)。
- 检查是否启用了 xdebug:
php -v输出含xdebug就关掉,临时运行:php -d zend_extension= -d xdebug.mode=off composer install - 某些老旧项目含大量废弃包(如
symfony/class-loader),它们的composer.json描述不规范,会触发更多次递归解析 -
composer update比install更耗资源:前者要重算整个依赖图,后者只按composer.lock还原——生产环境禁止在线update - 如果
composer.lock文件体积超 5MB(含大量dev-master哈希),解析反而更耗内存,可考虑人工清理再提交
php -d 和 COMPOSER_MEMORY_LIMIT 是两层独立限制,必须同时满足才有效——前者是 PHP 进程上限,后者是 Composer 内部调度上限。只设一个,另一层仍可能卡死。**


















