当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 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 4

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

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

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

3年前 评论

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

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

3年前 评论
91it 3年前

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

3年前 评论

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