【问题标题】:Composer Update failed -- out of memoryComposer 更新失败 - 内存不足
【发布时间】:2016-01-22 19:27:28
【问题描述】:

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

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

【问题讨论】:

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

标签: php out-of-memory composer-php


【解决方案1】:

这是内存问题,而不是存储问题。 您已达到 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字节)
  • 看看我链接到的问题.. 似乎很常见.. 有些人不得不将内存消耗增加到 1GB... 建议升级 PHP ,升级 Composer,并请求更准确的依赖版本( 1.1.x 而不是 1.x )以减少所需的检查量)
  • 附注...如果解决了您的问题,请单击答案旁边的小 V (:
  • 我想我会尝试研究第二点和第三点:v 好吧,问题还没有解决......
  • 内存使用量的最大减少可能是删除不需要的作曲家依赖项并要求更具体的版本——试试看。暂时尝试将最大内存增加到 512m。
【解决方案2】:

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

【讨论】:

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

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

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

【讨论】:

  • 我使用的是 windows 10,这个命令对我有用,php -d memory_limit=-1 "C:\ProgramData\ComposerSetup\bin\composer.phar" update
  • 这让我能够绕过这个内存错误并进行升级,谢谢 :)
  • 应该是 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 ?
【解决方案4】:

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

【讨论】:

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

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

/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 ...composer/PHP 对我来说越来越没用了。
  • 我在一台具有 16 GB RAM (memory_limit=-1) 的 Windows 机器上工作,并且遇到了同样的问题。甚至不能尝试使用大交换。也许我必须启动 Linux 系统才能运行 composer。真是一团糟
【解决方案6】:

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

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

Composer 安装将始终引用现有的 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 之前先尝试一下,因为它真的可以让你在基于云的设置上大吃一惊。
【解决方案7】:

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

【讨论】:

    【解决方案8】:

    内存限制错误

    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 炸弹功能的documentation


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

    php --ini
    

    来源:(作曲家docs

    【讨论】:

      【解决方案9】:

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

      【讨论】:

        【解决方案10】:

        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 可以使用它来完成 composer 命令。

        最初的解决方案似乎来自这个 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
        

        如果开启swap后收到这样的信息...

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

        ...根据需要更改权限

        sudo chmod 600 /var/swap.1
        

        【讨论】:

          【解决方案11】:

          我在一台 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
          

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

          【讨论】:

            【解决方案12】:

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

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

            例如。

            【讨论】:

              【解决方案13】:

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

              【讨论】:

                【解决方案14】:

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

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

                这对我有用。

                【讨论】:

                  【解决方案15】:
                  php -d memory_limit=-1 /usr/local/bin/composer update --no-scripts
                  

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

                  【讨论】:

                  • 您能否详细说明您的答案,也许通过解释代码?
                  【解决方案16】:

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

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

                  这样就成功了!

                  【讨论】:

                    【解决方案17】:
                    php -d memory_limit=-1 /usr/local/bin/composer install
                    

                    这个命令对我有用。

                    【讨论】:

                      【解决方案18】:

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

                      COMPOSER_MEMORY_LIMIT=-1 composer install
                      

                      【讨论】:

                        【解决方案19】:

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

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

                        【讨论】:

                          【解决方案20】:

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

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

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

                          【讨论】:

                          • 我非常喜欢这个答案,因为它不需要永久更改任何内容 - 当然,缺点是如果您将来遇到同样的需求,您可能会再次遇到麻烦,不得不去谷歌搜索这个答案再次:D
                          【解决方案21】:

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

                          composer update --lock
                          

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

                          您现在可以优化运行:

                          composer update
                          

                          composer install
                          

                          【讨论】:

                            【解决方案22】:

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

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

                            【讨论】:

                            • 非常感谢。它也可以用于几乎任何其他命令。
                            【解决方案23】:

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

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

                            【讨论】:

                              【解决方案24】:

                              试试这个

                              COMPOSER_MEMORY_LIMIT=-1 composer require [package name]
                              

                              【讨论】:

                              • 当我运行这个时我的电脑死机了......然后作曲家仍然失败并出现 OUT OF MEMORY 错误。
                              • 我从来没有遇到过,你的电脑有多少内存?
                              • 我有 8GB 的​​ RAM,所以不是这样。我的一位同事最终解决了它,但我不确定如何解决。我认为他通过删除 composer-lock.json 解决了这个问题。不过,谢谢!
                              【解决方案25】:

                              它对我有用!

                              从此链接下载您的 PHP 的 zip 64 位版本: 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
                              

                              【讨论】:

                                【解决方案26】:

                                如果您遇到 composer 内存问题,现在最好的选择可能是使用 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/

                                【讨论】:

                                  【解决方案27】:

                                  将作曲家更新到 v2。

                                  composer self-update --2
                                  

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

                                  php.ini中设置memory_limit=-1

                                  运行

                                  composer install
                                  

                                  【讨论】:

                                    【解决方案28】:

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

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

                                    【讨论】:

                                      猜你喜欢
                                      • 2020-12-23
                                      • 2013-07-30
                                      • 2015-01-07
                                      • 2017-04-30
                                      • 1970-01-01
                                      • 2015-01-28
                                      • 2012-02-09
                                      • 2011-06-26
                                      相关资源
                                      最近更新 更多