Composer更新失败--内存不足。

78

在我的虚拟机上运行composer.phar update时,我遇到了以下错误:

PHP 致命错误:在 phar:///bin/composer.phar/src/Composer/Util/RemoteFilesystem.php 的第179行尝试分配144115188075867549字节的内存空间,超出了允许的1073741824字节内存大小。

如有需要,这是composer.json文件内容:

{
        "description" : "The CodeIgniter framework",
        "name" : "codeigniter/framework",
        "license": "MIT",
        "require": {
                "php": ">=5.2.4",
                "videlalvaro/php-amqplib": "2.5.*"
        },
        "require-dev": {
                "mikey179/vfsStream": "1.1.*",
                "videlalvaro/php-amqplib": "2.5.*"
        }
}

这台虚拟机最近从一个磁盘坏道问题中恢复过来,运行虚拟机的人说它已经转移到了一个新的磁盘。在我的虚拟机中只有Java、PHP、httpd、postgre、rabbitmq和网站本身,而在这件事发生之前,它已经完美地运行了大约4个月。我正在使用PHP 5.6.11。有人能帮忙吗?


6
如果我的计算没错的话,我很高兴memory_limit存在,因为144115188075867549恰好是128PB。 - Álvaro González
我自己尝试了那个设置,一切都很顺利。你能否尝试清空整个vendor目录,然后再运行一次命令? - Álvaro González
现在我无法真正访问虚拟机,因为它是办公虚拟机,我无法从办公室外访问它。我会尝试您的建议并可能在周一更新结果。谢谢 :) - Aldibe
1
没错,它可以工作 :) 非常感谢 - Aldibe
请按照以下步骤获取快速解决方案:https://dev59.com/amEh5IYBdhLWcg3w9nlj#64589121 - pankaj
28个回答

104

请查看Composer故障排除维基,特别是关于内存限制错误的部分。

例如,可以像这样运行Composer:

php -d memory_limit=-1 `which composer` update

我不再遇到错误了。因此,这可能是一个内存不足的问题,可以在不更改默认PHP配置的情况下,在线解决。

上面的命令所做的是将PHP CLI内存限制设置为“无限”(即-1),然后运行内联的composer update命令。

请注意,您应该使用您的composer.phar PHP脚本的实际路径,而不是`which composer`。像我上面的例子中一样内联编写的which composer将被内联解析为您的composer.phar完整路径(您可以使用任何形式)。

注意:如果物理内存和虚拟内存都超过了上述解决方案可能会失败。如果是这种情况,则明显的解决方案是增加系统的虚拟内存,然后重试。


13
我使用的是Windows 10,这个命令对我有效:php -d memory_limit=-1 "C:\ProgramData\ComposerSetup\bin\composer.phar" update - user3870075
2
应该是 PHP -d memory_limit=-1 which composer update - Amorphous
2
很遗憾,对我来说它无法工作(win10,composer 1.9.0)。它分配了1.1 GB的内存(!)并显示“内存不足” - 尽管还有至少3 GB的空闲内存。重申一下:一个依赖解析工具分配了1.1 GB的内存...(!) - cljk
@cljk,请检查 PHP 版本。是 x84 还是 x64? - realization
现在已禁用内存限制,经过消耗4.8GB (!!!!) 的RAM,“composer install”似乎“成功”了一些。 现在的错误是“需要php ^5.3.6 || >=7.0 <7.2 -> 您的PHP版本(7.3.8)不满足该要求。” 哦天啊...好吧...这似乎是可以解决的。 - cljk
显示剩余7条评论

62

唯一解决我的问题的方法是这样做:

/bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024
/sbin/mkswap /var/swap.1
/sbin/swapon /var/swap.1

参考链接:Composer故障排除


1
这个答案可以用,但也许你可以扩展一下并解释一下原因。不管怎样,非常感谢! - Francisco Hanna
6
谢谢,就我个人而言,使用1.7 GB内存的Composer并未成功... 这个工具到底在做什么?据我所知,这是将npm工具用于PHP时非常不良的应用... - Thomas Urban
1
尝试使用PHP7.2安装Symfony... 1GB交换空间甚至不足以安装symfony/flex作为第一个要安装的依赖项...在相同的设置中使用npm建立开发环境以构建客户端应用程序,因此从1500多个包中获取数万个文件而从未抱怨缺乏RAM...composer/PHP对我来说越来越无用。 - Thomas Urban
1
我使用一台16GB RAM的Windows机器(memory_limit=-1),但仍然遇到同样的问题。甚至无法尝试使用大型交换文件。也许我必须启动Linux系统才能运行composer。真是一团糟。 - cljk

34

我使用以下方法,而非永久性地将您的内存限制设置为更高的数字(或无限制);

# Running an update
COMPOSER_MEMORY_LIMIT=-1 composer update
COMPOSER_MEMORY_LIMIT=-1 composer require PACKAGE/NAME

这将临时将composer内存限制环境变量设置为无限。


我非常喜欢这个答案,因为它不需要永久性地改变任何东西——当然缺点是,如果将来遇到相同的需求,你可能再次遇到麻烦,并且必须再次搜索这个答案 :D - Julix

31

通过删除整个 vendor 文件夹,然后再次执行 composer update,问题得到解决... 不过我甚至不明白为什么 :v


3
我猜想你以前的依赖集在Composer中引发了一个bug,导致它试图安排升级时进入了无限循环,但是如果从头开始直接安装,它可以处理得很好。如果你还保留了composer.lock文件,我想你可以提交一个工单。 - Álvaro González
1
删除供应商文件夹并运行 composer install 对我在 Windows 上起作用了。我猜更新比新安装需要更多的内存。 - Nick W
不要忘记提到清除Composer缓存是必要的哈哈 - Vitor
这似乎是解决这个问题的唯一方法。 - WISAM HAKIM

30
根据我的经验,来自composer的内存错误通常意味着它在寻找要安装的软件包的正确组合时消耗了太多内存,尤其是版本约束不够具体的情况下。例如,^5.2.4匹配5.3到5.3.29、5.4到5.4.45等版本。对于每个特定的版本和排列组合,composer都必须获取软件包的依赖项以检查是否满足所有约束条件。这通常会导致内存消耗巨大。
一旦版本确定,安装阶段使用的内存就少得多了。每个软件包的已解析版本也存储在composer.lock文件中,以便可以在其他环境中复制安装的特定排列组合。这是您问题的潜在解决方案:在开发机器上运行composer update(该机器应具有足够的内存),部署更新的composer.lock,并在服务器上运行composer install。
Composer install将始终引用现有的composer.lock以获取每个软件包要安装的版本,因此应很少遇到内存问题。
有关如何在composer.json中表达版本约束的参考,请查看https://getcomposer.org/doc/articles/versions.md

1
这对我来说是另一个问题的正确答案——我手动编辑了composer.json文件中的软件包版本号,这导致了内存限制错误。 - damtypo
1
我确认。我有一个旧的限制条件 "aws/aws-sdk-php": "~3.2",它解析为 3.204.0。所以我将这个限制条件更新为 "aws/aws-sdk-php": "~3.204",内存问题就解决了。 因此,我还审查了其他软件包的限制条件,以避免未来出现这样的问题。我建议在尝试调整 memory_limit 之前先尝试这种方法,因为它可能会在基于云的设置中给你带来麻烦。 - pstryk

17

Katiak的回答有效,但我不得不进行修改。在Linux机器上使用此方法需要4GB的可用空间。如果您不是root用户,请确保使用sudo命令:

/bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=4096
/sbin/mkswap /var/swap.1
/sbin/swapon /var/swap.1

对于像Drupal这样的某些仓库,Composer会占用大量内存。

本质上,这会从硬盘中创建4 GB的交换内存,CPU可以使用它来完成composer命令。

最初的解决方案似乎来自于这个Github线程,但我可能错了:

https://github.com/composer/composer/issues/7348#issuecomment-414178276

要在启动时加载swap,请在/etc/fstab中添加以下行。

/var/swap.1 none swap sw 0 0

为了保险起见,您可能希望备份您的fstab文件。

要重新获取交换空间,请执行以下操作:

sudo swapoff -v /var/swap.1
sudo rm /var/swap.1

如果您在启用交换空间后收到这样的消息...

swapon: /var/swap.1: insecure permissions 0644, 0600 suggested.

如适当,更改权限

sudo chmod 600 /var/swap.1

13

内存限制错误

Composer有时会在某些命令失败并显示以下消息:

PHP致命错误:允许的内存大小为XXXXXX字节已用尽 <...>

或者在我的情况下:

致命错误:内存不足(分配了1116733440字节,尝试分配134217728字节)位于phar://C:/ProgramData/ComposerSetup/bin/composer.phar/src/Composer/DependencyResolver/Pool.php的339行

在这种情况下,应该增加 PHP 的 memory_limit

注意:Composer在内部将 memory_limit 增加到1.5G

要获取当前的 memory_limit 值,请运行:

php -r "echo ini_get('memory_limit').PHP_EOL;"
尝试在您的php.ini文件中增加限制(例如,对于类似Debian的系统,为/etc/php5/cli/php.ini):
; Use -1 for unlimited or define an explicit value like 2G
memory_limit = -1

Composer同样会遵循由COMPOSER_MEMORY_LIMIT环境变量定义的内存限制:

COMPOSER_MEMORY_LIMIT=-1 composer.phar <...>

或者,您可以使用命令行参数来增加限制:

php -d memory_limit=-1 composer.phar <...>

当 cPanel 实例上启用 shell fork 炸弹保护时,也可能会出现此问题。有关更多信息,请参见 cPanel 网站上有关 fork 炸弹功能的文档


获取已加载 php.ini 文件的位置,请尝试:

php --ini
(Composer 文档

7
这是一个内存问题,而不是存储问题。 您已经达到了PHP内存限制。
请编辑/etc/php.ini并增加内存限制(memory_limit = 128M替换为memory_limit = 256M)。
我建议您寻找composer使用如此多内存的原因,并找到减少PHP内存使用的方法:
1. 如果还没有,请升级到PHP56
2. 安装Zend Opcache(在不同实例之间共享PHP内存)
3. 卸载所有未使用的PECL扩展
这就是您遇到的问题:https://github.com/composer/composer/issues/1898

2
Composer请求那么多的内存大小(分配144115188075867549字节)是可能/正常的吗? - Aldibe
看一下我链接的问题...似乎很常见..有些人不得不将内存消耗增加到1GB...那里的建议是升级PHP,升级Composer,并请求更准确的依赖版本(1.1.x而不是1.x)以减少所需的检查数量。 - DannyZB
如果这个答案解决了你的问题,请点击答案旁边的小V。 - DannyZB
我猜我会试着看看第二和第三点:v 嗯,问题还没有解决... - Aldibe
最大的内存使用减少可能来自于删除不必要的composer依赖项并请求更具体的版本 - 试一下。现在尝试将内存最大值暂时增加到512m。 - DannyZB
增加内存限制并重新启动Apache,这样做似乎起了作用...也许重启就是我所需要的。 - Andrew

7

我正在使用Windows机器,并尝试了这个问题的所有答案,但都不起作用。对我而言,我最终运行composer时需要使用64位版本的PHP才行。

要使用本地副本的PHP x64运行composer,可以执行以下操作:

  1. 从这里下载zip文件(我使用的是VC15 x64 Thread Safe版本):https://windows.php.net/download
  2. 解压文件
  3. 复制php.ini-development并重命名为php.ini
  4. 取消注释extension_dir = "ext"行和您将需要的任何其他php扩展(例如extension=gd2extension=openssl)。如果在运行命令时需要任何其他PHP扩展,则会告诉您。

工作命令:

"C:\path\to\php-7.2.23-Win32-VC15-x64\php.exe" -d memory_limit=-1 "C:/path/to/composer.phar" update

来源:https://ourcodeworld.com/articles/read/816/how-to-solve-composer-install-update-error-virtualalloc-failed-0x00000008

如何解决 Composer 安装、更新错误:VirtualAlloc 失败 0x00000008?

7

试试这个

COMPOSER_MEMORY_LIMIT=-1 composer require [package name]

当我运行这个程序时,我的电脑死机了...然后composer仍然因为内存不足错误而失败。 - Eliezer Berlin
从来没有发生过这种情况,你的电脑有多少内存? - Mahbubur Rahman Mishal
我有8GB的RAM,所以不是那个问题。我的一个同事最终解决了它,但我不确定他是如何解决的。我认为他通过删除composer-lock.json来解决了它。谢谢你! - Eliezer Berlin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接