当composer update卡住或提示内存不足时的分析

建议执行“composer update -vvv”查看具体卡住在哪,一般在下载,写入,读取类似这种

Downloading https://repo.packagist.org/p/guzzlehttp/psr7.json
Writing /root/.cache/composer/repo/https---packagist.phpcomposer.com/provider-guzzlehttp$psr7.json into cache

这时可以ctrl+c直接中断然后再次执行“composer update -vvv”发现它已经通过了刚刚卡住的地方了
具体原因不好不好说,不过我这测试服务器就1G内存加上交换空间的1G还是会卡住,看了下composer的源码有这块

$memoryLimit = trim(ini_get('memory_limit'));
    // Increase memory_limit if it is lower than 1.5GB
    if ($memoryLimit != -1 && $memoryInBytes($memoryLimit) < 1024 * 1024 * 1536) {
        @ini_set('memory_limit', '1536M');
    }
    // Set user defined memory limit
    if ($memoryLimit = getenv('COMPOSER_MEMORY_LIMIT')) {
        @ini_set('memory_limit', $memoryLimit);
    }
    unset($memoryInBytes, $memoryLimit);

说明如果设置php设置内存不够1536M,它会直接把内存限制设置到此数量,另外下面有个配置可以配置composer的内存限制,通过查看相关文档并对比测试后发现

//无限制
export COMPOSER_MEMORY_LIMIT=-1
//单位是byte (B)也即是300M
export COMPOSER_MEMORY_LIMIT=314572800

但如果设置比1536M低的内存在执行composer update等操作过程中还是会报内存不够,目前能解决的方式:加swap,更改镜像源

另外需要说明composer执行过程中由于是命令行执行,所以php.ini的内存限制并不生效

此处多说一句,有时laravel迁移环境后出现空白页面这种情况,除了了内部两个文件夹权限问题,有时需要执行composer update更新下才能解决

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 4

低配服务器update确实经常卡死。 我一般都是直接在本地 composer update ,生成composer.lock。再到服务器 composer install

4年前 评论
Limpid (楼主) 4年前

提示内存这个问题我前几天遇到过,就是这个方法,赞!

4年前 评论

跟机器内存没有直接关系(除非是真的小),前段时间在我电脑上(内存 8G )测试过这个问题, php.ini 里默认的 memory_limit128M ,此时安装 easyWechat 扩展失败,原因内存不足,修改 memory_limit100G ,安装成功,在多个 php 版本上反复测试了多次,结果均一致。

composer 版本为最新,镜像为阿里云

4年前 评论
91it 4年前

分享一个不用改php.ini的小技巧~ COMPOSER_MEMORY_LIMIT=-1 composer update

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!