答案是php -d memory_limit必须写在命令最前面,因composer作为php进程,其内存上限由php启动时决定且不可更改;错误顺序如composer install -d memory_limit=-1会被忽略,正确写法为php -d memory_limit=-1 composer install。

php -d memory_limit必须写在命令最前面
Composer 是 PHP 进程,它的内存上限由 PHP 启动时的 memory_limit 决定,进程一旦启动,这个值就锁死了。把 -d memory_limit 放错位置等于没写。
常见错误写法:composer install -d memory_limit=-1(参数被当成 Composer 子命令),或 COMPOSER_MEMORY_LIMIT=-1 composer install(PHP 进程早被 128M 卡死,根本没机会读取环境变量)。
- Linux/macOS 正确写法:
php -d memory_limit=-1 composer install - PowerShell 必须加引号:
php -d "memory_limit=-1" composer install - 用了
composer.phar?顺序不变:php -d memory_limit=2G ./composer.phar install - 单位必须大写:
2G有效,2g被 PHP 忽略
为什么 --no-dev 和 -o 能真·降内存峰值
composer install 卡在 Resolving dependencies,往往不是包多,而是 require-dev 里的包(比如 phpunit、laravel/pint)被全量解析——这部分常占内存 40%~60%。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
--no-dev:跳过 dev 依赖的安装和 autoload 生成,立竿见影 -
--optimize-autoloader(或简写-o):生成扁平 classmap,绕过 PSR-4 动态扫描,大幅降低 dump-autoload 阶段内存压力 - 上线部署推荐组合:
php -d memory_limit=1.5G composer install --no-dev -o - 如果项目
autoload.files引入了大体积 helper 文件,删掉或拆分,否则-o也救不了
CI/CD 里 composer install 失败但本地没问题
常见于 GitHub Actions、GitLab CI 等容器环境,错误看起来一样,但根因往往是容器默认内存小(如 ubuntu-latest 默认只给 7GB 总内存),或 PHP 配置未继承用户环境变量。
- Docker 用户注意:
docker run --memory=4g必须显式设置,否则即使php -d memory_limit=-1也会被 OOM killer 干掉 - CI 中不建议用
-1,优先设具体值:php -d memory_limit=2G COMPOSER_MEMORY_LIMIT=1536M composer install - PowerShell 设置环境变量:
$env:COMPOSER_MEMORY_LIMIT="1536M" - 某些共享主机禁用
-d参数,此时只能先在本地跑完composer update提交composer.lock,再在服务器上执行纯composer install
“Killed” 不是报错,是系统杀了你
终端只显示 Killed,无堆栈、无错误详情?大概率是 Linux OOM Killer 主动终止了 PHP 进程——它吃内存太多,内核直接 kill -9。
- 确认方法:
dmesg -O | grep -i "killed process",看到Out of memory: Kill process就坐实了 - Swap 能临时缓解但有代价:SSD 上加剧磨损,HDD 上让 Composer 卡成 PPT
- 比加 Swap 更有效的做法:
--no-dev -o --classmap-authoritative组合,可让内存峰值下降 40%~70% - 老版本 Composer 1.x 在大型项目中极易爆掉,升级到 v2.x 是基础前提
真正容易被忽略的点是:php -d memory_limit 解决的是 PHP 层限制,而 Killed 是系统层干预,两者要分开诊断。先查 dmesg,再调参数,别一上来就改 php.ini。










