Composer 更新失败——内存不足

Composer Update failed -- out of memory

我在虚拟机上 运行 composer.phar update 时遇到此错误:

PHP Fatal error: Allowed memory size of 1073741824 bytes exhausted (tried to allocate 144115188075867549 bytes) in phar:///bin/composer.phar/src/Composer/Util/RemoteFilesystem.php on line 179

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.*"
        }
}

VM 最近刚从坏磁盘扇区问题中恢复过来,运行 VM 说 VM 已移动到新磁盘。我的 VM 中只有 Java、PHP、httpd、postgre、rabbitmq 和网站本身,在发生这种情况之前,它已经 运行 完美地运行了大约 4 个月。我正在使用 PHP 5.6.11。有人可以帮忙吗?

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

通过删除整个 vendor 文件夹,然后再次执行 composer update 来解决,并且它有效……不知何故。我什至不明白:v

查看 Composer's troubleshooting wiki,尤其是内存限制错误部分。

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

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

我再也没有错误了。因此,这可能是内存不足的问题,可以在线解决,无需更改默认 PHP 配置。

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

请注意,您应该使用 composer.phar PHP 脚本的真实路径,而不是 `which composer`which composer 内联写入(如我上面的示例)将内联解析为您的 composer.phar 完整路径(您可以使用您喜欢的任何形式)。

Note: in case both the physical and virtual memory is exceeded the above solution might fail as well. If that is the case then the obvious solution would be to increase your system's virtual memory then try again.

sudo php -d memory_limit=-1 bin/magento setup:di:compile

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

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

REF:COMPOSER TROUBLESHOOTING

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

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

Composer 安装将始终参考现有的 composer.lock 版本来为每个包安装,因此应该很少 运行 出现内存问题。

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

就我而言,由于 vagrant box 中的 运行 composer install,我遇到了这个错误。 运行 它在我的主机内部并没有引起问题。

内存限制错误

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

PHP Fatal error: Allowed memory size of XXXXXX bytes exhausted <...>

Or in my case :

Fatal error: Out of memory (allocated 1116733440) (tried to allocate 134217728 bytes) in phar://C:/ProgramData/ComposerSetup/bin/composer.phar/src/Composer/DependencyResolver/Pool.php on line 339

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

Note: Composer internally increases the memory_limit to 1.5G.

获取当前memory_limit值,运行:

php -r "echo ini_get('memory_limit').PHP_EOL;"

尝试增加 php.ini 文件中的限制(例如 /etc/php5/cli/php.ini for Debian-喜欢系统):

; 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 <...>

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


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

php --ini

来源:(作曲家docs

您也可以通过删除 vendor 目录和 re-execute composer install 命令来解决问题。

Katiak 的回答有效,但我不得不修改它。要在 Linux 机器上运行,您需要 4 GB 免费 space。如果您不是 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

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

为了安全起见,您可能需要备份 fstab 文件。

要收回交换 space 执行此操作:

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

我在 Windows 机器上尝试了这个问题的所有答案,但其中 none 有效。对我来说,在我 运行 作曲家 使用 PHP.

的 64 位版本后,它终于起作用了

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

  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

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

尝试增加活动 php.ini 文件中的 memory_limit 值。

; Maximum amount of memory a script may consume (128MB)
; http://php.net/memory-limit
memory_limit = 512M

例如

除了将 memory_limit = -1 放入 php.ini 文件外,对我没有任何作用。

此解决方案将解决您的问题。

更新您的 php.ini 文件,然后重新启动 Apache 或您的服务器 例子: memory_limit=128M 到 memory_limit=1128M

对我有用。

php -d memory_limit=-1 /usr/local/bin/composer update --no-scripts

memory_limit=-1 用于此进程的无限内存 当您在 composer 之前添加 php 以获得无限内存时,您必须为 composer 提供其安装在服务器(对于 ubntu)上的完整路径 /usr/local/bin/composer Reamining 部分只是 compoer 命令 update/install

增加 php.inimemory_limit 值并没有解决我的问题。 我所做的是:

  1. 删除composer.lock、
  2. 运行作曲家更新,

成功了!

php -d memory_limit=-1 /usr/local/bin/composer install

这个命令对我有用。

既适用于本地环境又适用于可能以棘手方式安装 composer 的容器(例如,在管道的构建阶段)的解决方案是

COMPOSER_MEMORY_LIMIT=-1 composer install

我在我的 php.ini 文件中设置了 memory_limit=-1 但没有用,但我继续执行下面 link 的命令,然后 运行 composer install 和工作完美

https://tecadmin.net/enable-swap-on-ubuntu/

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

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

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

如果您在更新内存限制后仍然遇到问题,那么最好的尝试是 运行:

composer update --lock

这将更新您的锁定文件,以便在您更改了 composer.json 文件后,作曲家可以 运行 使用它。

您现在可以优化 运行:

composer update

composer install

在 Windows 上使用软件 Laragon 时,以下行帮助我在没有出现内存错误的情况下需要一个新包:

php -d memory_limit=-1 "C:\laragon\bin\composer\composer.phar" require <insert package author here>/<insert package name here>

如果在 Windows 上,使用 XAMP,我建议将您的 Composer 版本更新到最新版本。 卸载,下载最新版本 - https://getcomposer.org/download/ 并安装。

也可以尝试将 PHP 版本更新到最新版本。

试试这个

COMPOSER_MEMORY_LIMIT=-1 composer require [package name]

对我有用!

从 link 下载 PHP 的 64 位 zip 版本: https://windows.php.net/download/

现在将其解压到 C:\PHP-74\ 并将 php.ini-development 重命名为 php.ini

现在打开此 php.ini 并通过删除 ;(分号)取消注释以下内容。

extension_dir = "ext"
extension=bz2
extension=curl
extension=fileinfo
extension=gd2
extension=gettext
extension=mbstring
extension=exif      ; Must be after mbstring as it depends on it
extension=mysqli
extension=openssl
extension=pdo_sqlite

在我的情况下,这些扩展是必需的,您可以比较 xampp 的旧 php.ini 文件或 wamp 解决这个问题。现在保存文件并运行以下命令。

"C:\PHP-74\php.exe" -d memory_limit=-1 "C:\ProgramData\ComposerSetup\bin\composer.phar" update

如果您 运行 遇到 composer 内存问题,现在最好的选择可能是使用 composer v2,如果可以的话。

Composer v2 有许多性能改进,因此占用的内存更少。

我一直不得不使用 COMPOSER_MEMORY_LIMIT=-1 composer update 但在 v2 更新后,我不再需要使用它了。

查看发布公告https://blog.packagist.com/composer-2-0-is-now-available/ or download the latest version https://getcomposer.org/download/

将作曲家更新到 v2。

composer self-update --2

删除 vendor 路径和 composer.lock 文件。

设置在php.inimemory_limit=-1.

运行

composer install

这个帮助了我,显示了内存使用情况:

php -d memory_limit=-1 /usr/local/bin/composer update --verbose --profile