ChatGPT解决这个技术问题 Extra ChatGPT

Composer 更新失败 - 内存不足

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

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

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

我很高兴 memory_limit 存在,因为如果我计算正确的话 144115188075867549 正好是 128 PB...
我自己尝试过这些设置,一切都很好。您能否尝试清除整个 vendor 目录并再次运行该命令?
现在我无法真正访问虚拟机,因为它是办公室虚拟机,我无法从办公室外访问它。我会尝试你的建议并可能在星期一更新结果。谢谢 :)
是的,它有效:) 非常感谢
stackoverflow.com/questions/21815635/… 遵循此以获得快速和快速的解决方案。

E
Eugen Mihailescu

检查 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 完整路径(您可以使用任何您喜欢的形式)。

注意:如果超出物理内存和虚拟内存,上述解决方案也可能会失败。如果是这种情况,那么显而易见的解决方案是增加系统的虚拟内存,然后再试一次。


我使用 Windows 10,这个命令对我有用, php -d memory_limit=-1 "C:\ProgramData\ComposerSetup\bin\composer.phar" 更新
这使我能够解决此内存错误并进行升级,谢谢:)
应该是 php -d memory_limit=-1 which composer update
对我来说,遗憾的是它不起作用(win10,composer 1.9.0)。它分配了 1.1 GB (!!!!) 并以“内存不足”退出 - 尽管至少还有 3 GB 可用空间。重复:1.1 GB(!)由依赖解析工具分配......(!)
@cljk,检查 php 版本。 x84 还是 x64 ?
k
katiak

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

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

参考:COMPOSER TROUBLESHOOTING


这行得通。但也许你可以扩展你的答案并解释原因。不管怎么说,还是要谢谢你!!
谢谢,就我而言,作曲家在 1.7 GB RAM 上没有成功……这个工具到底在做什么? AFAIS 对 PHP 的 npm 之类的工具的采用非常糟糕......
尝试使用 PHP7.2 安装 Symfony ... 1GB 交换甚至不足以将 symfony/flex 安装为要安装的第一个依赖项... npm 用于同一设置中,建立用于构建客户端应用程序的开发环境,从而从 1500 多个包中获取数以万计的文件,而没有抱怨缺乏 RAM ......作曲家/PHP 对我来说越来越无用。
我在一台具有 16 GB RAM (memory_limit=-1) 的 Windows 机器上工作,并且遇到了同样的问题。甚至不能尝试使用大交换。也许我必须启动 Linux 系统才能运行 composer。真是一团糟
s
squall3d

根据我的经验,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


这对我来说是另一个问题的正确答案 - 我在 composer.json 中手动编辑了包的版本号,它导致了内存限制错误。
我确定。我有一个旧约束 "aws/aws-sdk-php": "~3.2",它正在解析为 3.204.0。所以我将此约束更新为 "aws/aws-sdk-php": "~3.204" 并且内存问题消失了。因此,我还审查了其他软件包的约束,以避免将来出现此类问题。我建议在使用 memory_limit 之前先尝试一下,因为它真的可以让您在基于云的设置中受益。
a
ajtrichards

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

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

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


我非常喜欢这个答案,因为它不需要永久更改任何内容 - 当然,缺点是如果您将来遇到相同的需求,您可能会再次遇到麻烦并且不得不再次谷歌搜索这个答案:D
A
Aldibe

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


我猜你之前的依赖集触发了 Composer 中的一个错误,并使其进入一个无限循环,试图安排升级,但它可以很好地处理从头开始的直接安装。如果您碰巧保留了 composer.lock 文件,我想您可以提交票证。
删除供应商文件夹并运行 composer install 对我来说在 Windows 上工作。我猜更新比较比全新安装占用更多内存。
不要忘记提到清除作曲家缓存是必要的哈哈
这看起来是解决这个问题的唯一方法
p
pmagunia

Katiak 的答案有效,但我不得不修改它。您需要 4 GB 的可用空间才能在 Linux 机器上工作。如果您不是 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 可以使用它来完成作曲家命令。

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

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

要在启动时加载交换,在 /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

c
chebaby

内存限制错误

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

PHP 致命错误:允许的 XXXXXX 字节的内存大小已用完 <...> 或者在我的情况下:致命错误:phar://C:/ProgramData/ComposerSetup/ 中的内存不足(已分配 1116733440)(试图分配 134217728 字节) 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 文件中的限制(例如,/etc/php5/cli/php.ini 用于类似 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 fork 炸弹保护被激活时,这个问题也可能发生在 cPanel 实例上。有关详细信息,请参阅 cPanel 网站上的分叉炸弹功能的 documentation

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

php --ini

来源:(作曲家 docs


D
DannyZB

这是内存问题,不是存储问题。您已达到 PHP 内存限制。

编辑 /etc/php.ini 并增加内存限制( memory_limit = 128M 替换为 memory_limit = 256M )

我建议你寻找作曲家使用这么多内存的原因,并找到减少 PHP 内存使用的方法:

如果您尚未安装 Zend Opcache(在不同实例之间共享 PHP 内存),请升级到 PHP56 卸载任何和所有未使用的 PECL 扩展

这是您遇到的问题:https://github.com/composer/composer/issues/1898


作曲家是否有可能/正常请求那么多内存大小? (分配144115188075867549字节)
看看我链接到的问题.. 似乎很常见.. 有些人不得不将内存消耗增加到 1GB... 建议升级 PHP ,升级 Composer 并请求更准确的依赖版本( 1.1.x 而不是 1.x ) x ) 以减少所需的检查数量)
ps ...如果解决了您的问题,请单击答案旁边的小V(:
我想我会尝试研究第二点和第三点:v 好吧,问题还没有解决......
内存使用量的最大减少可能是删除不需要的作曲家依赖项并要求更具体的版本——试试看。并尝试暂时将最大内存增加到 512m。
J
Jared Forth

试试这个

COMPOSER_MEMORY_LIMIT=-1 composer require [package name]

当我运行此程序时,我的电脑死机了……然后作曲家仍然因内存不足错误而失败。
我从来没有遇到过,你的电脑有多少内存?
我有 8GB 的 RAM,所以不是这样。我的一位同事最终解决了它,但我不确定如何解决。我认为他通过删除 composer-lock.json 解决了这个问题。不过还是谢谢!
K
Keven

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

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

从这里下载 zip 文件(我使用的是 VC15 x64 Thread Safe 版本): https://windows.php.net/download 解压文件 复制 php.ini-development 并重命名为 php.ini 取消注释 extension_dir = "ext"行和您需要的任何其他 php 扩展(例如 extension=gd2 或 extension=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


D
DenBrown

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

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

非常感谢。它也可以用于几乎任何其他命令。
A
Alex Christodoulou

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

COMPOSER_MEMORY_LIMIT=-1 composer install

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

这个命令对我有用。


R
R Sun

就我而言,由于在 vagrant box 内运行 composer install,我遇到了这个错误。在我的主机中运行它不会导致问题。


C
Corentin Pane

除了将 memory_limit = -1 放入 php.ini 文件之外,没有什么对我有用。


S
Silvester Wanjiru

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

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


A
Ahsan Najam

它对我有用!

从以下链接下载您的 PHP 的 64 位 zip 版本:https://windows.php.net/download/

https://i.stack.imgur.com/72Kqg.png

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

https://i.stack.imgur.com/Iruni.png

现在打开这个 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

Д
Денис Чорний

将作曲家更新到 v2。

composer self-update --2

删除供应商路径和 composer.lock 文件。

php.ini memory_limit=-1 中设置。

composer install

J
Jokerius

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

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

S
Shadman

您也可以通过删除供应商目录并重新执行 composer install 命令来解决。


P
PiggyMacPigPig

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

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

例如。


V
Vin

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

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

这是我的工作。


H
Hassan Ali Shahzad
php -d memory_limit=-1 /usr/local/bin/composer update --no-scripts

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


您能否通过解释代码来详细说明您的答案?
N
Nikos Hidalgo

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

删除 composer.lock,运行 composer update,

这就是诀窍!


R
Rosue Walford

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

composer update --lock

这将更新您的锁定文件,以便如果您更改了 composer.json 文件,composer 可以从中运行。

您现在可以优化运行:

composer update

或者

composer install

A
Andrew

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

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


M
Mr U.

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

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

我总是不得不使用 COMPOSER_MEMORY_LIMIT=-1 composer update,但在 v2 更新之后,我不再需要使用它。

查看发布公告 https://blog.packagist.com/composer-2-0-is-now-available/ 或下载最新版本 https://getcomposer.org/download/


G
Ghisoi Ioan

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


您能否解释一下您的建议如何解决原始问题。通常应避免仅使用代码的答案。