Composer Update失败 - 内存不足

Ald*_*ibe 15 php out-of-memory composer-php

composer.phar update在我的VM上运行时出现此错误:

PHP致命错误:第179行的phar:///bin/composer.phar/src/Composer/Util/RemoteFilesystem.php中允许的内存大小为1073741824字节(尝试分配144115188075867549字节)

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.*"
        }
}
Run Code Online (Sandbox Code Playgroud)

VM刚刚从坏的磁盘扇区问题中恢复,运行VM的人说VM已经移动到新磁盘.在我的虚拟机中只有Java,PHP,httpd,postgre,rabbitmq和网站本身,在此之前它已经运行了大约4个月.我正在使用PHP 5.6.11.有人可以帮忙吗?

Eug*_*scu 26

查看Composer的故障排除 wiki,尤其是内存限制错误部分.

例如,通过运行这样的作曲家:

php -d memory_limit=-1 `which composer` update
Run Code Online (Sandbox Code Playgroud)

我不再有任何错误了.所以它可能是一个内联不足的内存问题,而不会改变你的默认PHP配置.

上面的命令是什么,它将PHP CLI内存限制设置为"无限制"(即-1),然后它运行内联composer update命令.

请注意,您应该使用PHP脚本的真实路径,而不是"哪个作曲家"composer.phar.该which composer书面内联(如上面的示例所示)将在线解决您的composer.phar完整路径(你可以使用任何你喜欢的形式).

  • 我使用Windows 10,并且此命令对我有用,php -d memory_limit = -1“ C:\ ProgramData \ ComposerSetup \ bin \ composer.phar”更新 (2认同)
  • 应该是 php -d memory_limit=-1 `which composer update` (2认同)
  • 对我来说遗憾的是它不起作用(win10,composer 1.9.0)。它分配了 1.1 GB(!!!)并以“内存不足”退出 - 尽管还有至少 3 GB 的可用空间。重复一下:1.1 GB(!)由依赖解析工具分配....(!) (2认同)

ajt*_*rds 22

我没有将您的内存限制永久设置为增加的数量(或无限),而是使用它;

# Running an update
COMPOSER_MEMORY_LIMIT=-1 composer update
Run Code Online (Sandbox Code Playgroud)
COMPOSER_MEMORY_LIMIT=-1 composer require PACKAGE/NAME
Run Code Online (Sandbox Code Playgroud)

暂时将作曲家内存限制环境变量设置为无限制。


小智 18

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

/bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024
/sbin/mkswap /var/swap.1
/sbin/swapon /var/swap.1
Run Code Online (Sandbox Code Playgroud)

REF:COMPOSER TROUBLESHOOTING

  • 谢谢,在我的情况下,composer 没有成功使用 1.7 GB 内存……这个工具到底在做什么?AFAIS 对像 npm for PHP 这样的工具的采用非常糟糕...... (6认同)

Par*_*rag 15

Katiak 的回答有效,但我不得不修改它。您需要 4 GB 的可用空间才能在 Linux 机器上运行。sudo如果你不是 root,请确保你的命令:

/bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=4096
/sbin/mkswap /var/swap.1
/sbin/swapon /var/swap.1
Run Code Online (Sandbox Code Playgroud)

Composer 为某些存储库(如 Drupal)占用了大量内存。

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

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

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

要在引导时加载交换,请添加以下行 /etc/fstab

/var/swap.1 none swap sw 0 0
Run Code Online (Sandbox Code Playgroud)

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

要回收交换空间,请执行以下操作:

sudo swapoff -v /var/swap.1
sudo rm /var/swap.1
Run Code Online (Sandbox Code Playgroud)

如果您在打开交换后收到这样的消息...

swapon: /var/swap.1: insecure permissions 0644, 0600 suggested.
Run Code Online (Sandbox Code Playgroud)

...在适当的情况下更改权限

sudo chmod 600 /var/swap.1
Run Code Online (Sandbox Code Playgroud)


che*_*aby 12

内存限制错误

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

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

或者就我而言:

致命错误:第 339 行的 phar://C:/ProgramData/ComposerSetup/bin/composer.phar/src/Composer/DependencyResolver/Pool.php 中的内存不足(已分配 1116733440)(试图分配 134217728 字节)

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

注:作曲家内部增加memory_limit1.5G

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

php -r "echo ini_get('memory_limit').PHP_EOL;"
Run Code Online (Sandbox Code Playgroud)

尝试增加php.ini文件中的限制(例如,/etc/php5/cli/php.ini对于类 Debian 的系统):

; Use -1 for unlimited or define an explicit value like 2G
memory_limit = -1
Run Code Online (Sandbox Code Playgroud)

Composer 还遵守COMPOSER_MEMORY_LIMIT环境变量定义的内存限制:

COMPOSER_MEMORY_LIMIT=-1 composer.phar <...>
Run Code Online (Sandbox Code Playgroud)

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

php -d memory_limit=-1 composer.phar <...>
Run Code Online (Sandbox Code Playgroud)

当 shell fork 炸弹保护被激活时,这个问题也可能发生在 cPanel 实例上。有关更多信息,请参阅cPanel 站点上的 fork 炸弹功能文档


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

php --ini
Run Code Online (Sandbox Code Playgroud)

来源:(作曲家文档


小智 10

根据我的经验,作曲家的内存错误通常意味着它花了太多的内存来寻找要安装的软件包的正确组合,尤其是版本限制不够具体。例如,^ 5.2.4匹配5.3到5.3.29、5.4到5.4.45等。对于每个特定的版本和排列,作曲者必须获取程序包的依赖项以检查是否满足所有约束。通常这是在内存消耗变得巨大时。

一旦确定了版本,安装阶段将使用更少的内存。每个软件包的已解析版本也存储在composer.lock文件中,以便可以在其他环境中复制安装的特定排列。这是解决您问题的潜在解决方案:在开发机中运行composer update(应该具有足够的内存),部署更新的composer.lock,然后在服务器上运行composer install。

对于每个软件包要安装的版本,Composer安装将始终引用现有的composer.lock,因此很少会遇到内存问题。

有关如何在composer.json中表达版本约束的参考,请查看https://getcomposer.org/doc/articles/versions.md


Ald*_*ibe 9

通过删除整个供应商文件夹解决,然后再次进行作曲家更新,它工作......不知何故.我甚至不明白:v

  • 我猜您先前的依赖集触发了Composer中的一个错误,并使其进入无限循环以尝试安排升级,但是它可以从头开始直接安装。我想如果您碰巧保留了`composer.lock`文件,那么您可以提出诉讼。 (2认同)

Dan*_*yZB 6

这是内存问题,不是存储问题。您已达到 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

  • 作曲家请求那么多内存大小是否可能/正常?(分配 144115188075867549 字节) (2认同)

Kev*_*ven 6

我在一台 Windows 机器上,我尝试了这个问题的所有答案,但没有一个奏效。对我来说,在我使用 64 位版本的 PHP运行 composer 后,它终于奏效

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

  1. 从这里下载 zip 文件(我使用的是 VC15 x64 线程安全版本):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
Run Code Online (Sandbox Code Playgroud)

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


Den*_*own 6

在 Windows 上使用 Laragon 软件时,以下行帮助我需要一个新包而不会出现内存错误:

php -d memory_limit=-1 "C:\laragon\bin\composer\composer.phar" require <insert package author here>/<insert package name here>
Run Code Online (Sandbox Code Playgroud)


小智 5

试试这个

COMPOSER_MEMORY_LIMIT=-1 composer require [package name]
Run Code Online (Sandbox Code Playgroud)