【问题标题】:Composer update memory limitComposer 更新内存限制
【发布时间】:2016-07-06 13:35:48
【问题描述】:

我需要在主机上运行 composer update,所以我使用 ssh 登录并尝试在我安装了 Laravel 和 composer 的 /www 文件夹中运行以下命令:

composer update

我收到此错误:

我正在与我的托管服务提供商联系,他们告诉我运行命令:

php -d memory_limit=512M composer update

我运行了这个命令,但得到:“无法打开文件:composer”

怎么办?这里的解决方案是什么?

【问题讨论】:

  • 正如@Sven 所说,在生产中composer install 就足够了。在你的情况下,在使用共享主机时,我认为你不会让composer update 工作,所以唯一的方法是购买像 Digital Ocean、Linode 这样的 VPS 主机。

标签: php laravel ssh composer-php


【解决方案1】:

将其设置为使用尽可能多的内存:

COMPOSER_MEMORY_LIMIT=-1 composer update

【讨论】:

  • 我们如何在全局范围内设置这个值或任何值?而不必每次都通过 CLI 执行此操作?
  • @snh_nl 你需要设置 php 内存限制。示例:chapterthree.com/blog/how-fix-composer-memory-issue
  • 使用COMPOSER_MEMORY_LIMIT=-1; export COMPOSER_MEMORY_LIMIT 在您的/etc/profile(或您使用的任何shell)中全局定义它。或者定义一个shell别名? alias memcomposer='COMPOSER_MEMORY_LIMIT=-1 composer',然后使用memcomposer 而不是composer
  • 它仍然显示Fatal error: Allowed memory size of 2147483648 bytes exhausted (tried to allocate 4096 bytes) in phar://C:/ProgramData/ComposerSetup/bin/composer.phar/src/Composer/DependencyResolver/RuleWatchGraph.php on line 52
  • @Ozan Kurt 您可能已经用完了虚拟机或实际计算机可用的所有内存。如果您使用的是 VM,请尝试增加其内存限制。
【解决方案2】:

当您运行composer update 时,操作系统将查看配置的路径并尝试找到具有该名称的可执行文件。

在运行php composer update 时,composer 字符串被视为 PHP 的参数,不会在任何路径中搜索。您必须提供完整路径才能运行它。

运行 which composer 会告诉你操作系统在哪里找到 composer 可执行文件,然后你只需在 PHP 命令中使用完整路径:

$>which composer
/usr/local/bin/composer

$>php -d memory_limit=512M /usr/local/bin/composer update
...

请注意,512MB 可能太少。我的看法是它会很高兴地占用 1GB 或更多,这取决于你使用的依赖项的数量和理论上允许的版本的多样性,即如果你允许 Symfony ~2.3,那么你让 Composer 处理更多可能的版本与使用 ~2.7 相比。

还要注意,在生产机器上运行 Composer 并不是最好的主意。您必须有权访问 Github,可能需要提供访问凭据,安装 VCS 工具,并且如果任何远程托管服务器在更新期间处于脱机状态,您将很容易破坏您的站点。在完成所有准备工作的部署系统上使用 Composer 是一个更好的主意,然后将所有文件移动到生产服务器上。

更新

现在是 2020 年,Composer 管理其内存的方式发生了很大变化。最重要的是 Composer 会在遇到设置过低的限制时自行增加内存限制。然而,这会立即触发安装内存太少的机器上内存不足的问题。您可以通过设置像COMPOSER_MEMORY_LIMIT=512M 这样的环境变量来使 Composer 使用更少的内存,但是如果 Composer 需要更多内存才能正确运行,这会产生问题。

我的主要观点仍然正确:不要在安装了太少内存的机器上运行 Composer。您可能需要 1.5 GB 的可用内存才能更新所有内容。

【讨论】:

  • 我只是写: php -r "readfile('getcomposer.org/installer');" | php,之后一切正常......也感谢帮助
  • php -d memory_limit=-1 $(which composer) update 更方便,因为不需要指定composer路径。
  • 这很棒。我不知道您可以为单个命令增加内存。这样做是对的吗?
  • 在windows中怎么样?
  • @Rax 还有一件事,如果你在 mingw 上的 windows 中运行这个命令,那么你会得到一个必须翻译路径的错误,所以使用这个命令php -d memory_limit=-1 $(which composer).phar update
【解决方案3】:

对我来说最好的解决方案是

COMPOSER_MEMORY_LIMIT=-1 composer require <package-name>

@realtebo 提及

【讨论】:

    【解决方案4】:

    我遇到了 composer 的问题,因为它消耗了所有可用内存,然后进程被杀死(实际上,输出消息是“Killed”)

    所以,我一直在寻找限制作曲家内存使用的解决方案。

    我试过(来自@Sven 的回答)

    $ php -d memory_limit=512M /usr/local/bin/composer update
    

    但它没有工作,因为

    “Composer 内部将 memory_limit 增加到 1.5G。”

    -> 来自作曲家官网。

    然后我找到了一个有效的命令:

    $ COMPOSER_MEMORY_LIMIT=512M php composer.phar update
    

    虽然,在我的情况下 512mb 是不够的!

    来源:https://www.agileana.com/blog/composer-memory-limit-troubleshooting/

    【讨论】:

    • 我不得不像这样使用作曲家:COMPOSER_MEMORY_LIMIT=1024M composer require 'module'
    • 类似,我用COMPOSER_MEMORY_LIMIT=-1 composer require &lt;package name&gt;
    【解决方案5】:

    我必须在命令行中结合COMPOSER_MEMORY_LIMITmemory_limit

    在 Windows 上:

    set COMPOSER_MEMORY_LIMIT=99999999999&& php -d memory_limit=-1 composer.phar update
    

    在 Linux 上:

    export COMPOSER_MEMORY_LIMIT=99999999999 && php -d memory_limit=-1 composer.phar update
    

    【讨论】:

    • 这是唯一一个在 Mac OS X El Capitan 上为我工作的。
    • 只是做set COMPOSER_MEMORY_LIMIT=-1 然后我的composer命令在Windows上为我工作。
    【解决方案6】:

    如果有足够的内存,composer 会在内部消耗它并毫无问题地运行。不需要专门告诉作曲家去做。

    您是否尝试过增加交换内存,因为它对我有用。我将交换内存增加到 4096Mb (4GB),现在对我来说一切都很好。

    首先使用“sudo free”查看可用内存和交换内存。并将交换配置为,

    对于 Debian:

    sudo fallocate -l 4G /swapfile
    sudo dd if=/dev/zero of=/swapfile bs=4096k count=1048
    sudo chmod 600 /swapfile
    sudo mkswap /swapfile
    sudo swapon /swapfile
    

    要使其永久添加到 /etc/fstab 文件,/swapfile swap swap defaults 0 0

    对于 CentOS:

    [root@myserver]:/# cd /var
    [root@myserver]:/var# touch swap.img
    [root@myserver]:/var# chmod 600 swap.img
    [root@myserver]:/var# mkswap /var/swap.img
    
    [root@myserver]:/var# dd if=/dev/zero of=/var/swap.img bs=4096k count=1000
    [root@myserver]:/var# mkswap /var/swap.img 
    [root@myserver]:/var# swapon /var/swap.img
    

    您可以通过更改 bs= 1024k 或 2048k 或 8096k 来增加交换内存 取决于您的物理卷大小。 使用 'swapon' 和 swapoff 命令来查看差异。

    检查“swappiness”(60 应该很好,)

    cat /proc/sys/vm/swappiness
    

    【讨论】:

      【解决方案7】:

      您可以更改 php.ini 中的 memory_limit

      尝试增加 php.ini 文件中的限制

      使用 -1 表示无限制或定义一个明确的值,例如 2G

      memory_limit = -1
      

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

      阅读文档getcomposer.org

      【讨论】:

        【解决方案8】:

        我在 Windows 10 上制作并与我一起工作:

        php -d memory_limit=-1 C:/ProgramData/ComposerSetup/bin/composer.phar update
        

        你可以改变xx你想要的值

         memory_limit=XX
        

        【讨论】:

          【解决方案9】:

          在 MAC OS High Siera 上,我运行了以下命令:

          MacBook-Pro:asiu jack$ php --ini
          

          返回:

          Configuration File (php.ini) Path: /usr/local/etc/php/7.4
          Loaded Configuration File:         /usr/local/etc/php/7.4/php.ini
          Scan for additional .ini files in: /usr/local/etc/php/7.4/conf.d
          Additional .ini files parsed:      /usr/local/etc/php/7.4/conf.d/ext- 
          opcache.ini,
          /usr/local/etc/php/7.4/conf.d/php-memory-limits.ini
          

          以上所有答案都是设置加载的配置并更新,但请注意解析的其他 .ini 文件将 php-memory-limits.ini 作为单独的文件。您还必须更新此文件内存限制。同样的方式在文本编辑器中打开并更改为 2G 之类的东西。内存限制失败的输出应该告诉您它需要运行多少内存,只需将其设置为高于该值或 -1 表示无限制。

          【讨论】:

            【解决方案10】:

            当您更新大型库或具有大量依赖项的库时,可能会发生此错误。 Composer 可能非常消耗内存。

            确保您的作曲家本身已更新到最新版本:

            php composer.phar --self-update
            

            您可以通过添加composer memory limit环境变量来临时增加composer的内存限制:

            COMPOSER_MEMORY_LIMIT=128MB php composer.phar update
            

            对兆字节使用“128M”格式,对千兆字节使用“2G”格式。您可以使用值“-1”完全忽略内存限制。

            另一种方法是增加 PHP 内存限制:

            php -d memory_limit=512M composer.phar update ...
            

            【讨论】:

              【解决方案11】:

              您的 aws 服务器有多大?如果它只有 1gb 的内存,在 php.ini 中设置 2gb 的内存限制将无济于事。

              如果您不能/不想同时增加服务器端以获得更多可用 RAM,您也可以启用 SWAP。

              见这里how to enable swap. 它支持 4GB,虽然我自己通常只做 1GB。

              来源:来自 laracast 网站

              【讨论】:

                【解决方案12】:

                我正在使用 Homestead 运行 Laravel 6,也遇到了这个问题。正如其他答案中所建议的那样,您可以将 COMPOSER_MEMORY_LIMIT=-1 前缀到单个命令并正常运行该命令。如果您想更新您的 PHP 配置以始终允许无限内存,请按照以下步骤操作。

                vagrant up
                vagrant ssh
                php --version # 7.4
                php --ini # Shows path to the php.ini file that's loaded
                cd /etc/php/7.4/cli # your PHP version. Each PHP version has a folder
                sudo vi php.ini
                

                memory_limit=-1 添加到您的 php.ini 文件中。如果您在使用 Vim 或编辑 php.ini 文件时遇到问题,请查看this answer,了解如何使用 Vim 编辑 php.ini 文件。该文件应如下所示:

                ; Maximum amount of memory a script may consume
                ; http://php.net/memory-limit
                memory_limit = -1
                

                请注意,这可能会占用您机器上无限量的内存。可能不是生产的好主意,哈哈。使用 Laravel 代客必须关注 this article 并在此处更新内存值:

                sudo vi /usr/local/etc/php/7.4/conf.d/php-memory-limits.ini
                

                然后用 Valet 重启服务器:

                valet restart
                

                This answer 也有助于在 Mac 上使用 Laravel Valet 更改配置,以便更改生效。

                【讨论】:

                  【解决方案13】:
                  <C:\>set COMPOSER_MEMORY_LIMIT=-1
                  <C:\>composer install exhausted/packages
                  

                  【讨论】:

                  • 请在您的答案中添加一些解释,以便其他人可以从中学习
                  【解决方案14】:

                  对于那些使用Laravel Homestead的人

                  写在Homestead.yaml

                  variables:
                      - key: COMPOSER_MEMORY_LIMIT
                        value: -1
                  

                  【讨论】:

                    【解决方案15】:

                    对于 Laravel

                    第 1 步。打开终端

                    步骤 2.cd 进入你的 laravel 目录

                    步骤 3. 在您的 laravel 目录中键入命令 which composer,并记下 composer 所在的目录。

                    步骤 4. 运行命令php -d memory_limit=-1 /opt/cpanel/bin/composer update(如果它适合你,你也可以运行代码)

                    (将/opt/cpanel/bin/composer改成第三步返回的目录路径)

                    问题已解决

                    【讨论】:

                      【解决方案16】:

                      就我而言,没有一个答案有帮助。最后事实证明,更改为 64 位版本的 PHP(M$ Windows)立即解决了这个问题。我没有更改任何设置 - 它只是工作。

                      【讨论】:

                      • 你能解释一下你是如何将php版本从32位更改为64位的吗?
                      • @HaritsinhGohil 只需从php.net/downloads.php 下载 64 位版本,重命名您的 32 位文件夹并将 64 位版本复制到旧版本名称的文件夹中。
                      【解决方案17】:
                      • 转到您的php ini 文件
                      • 设置memory_limit = -1

                      【讨论】:

                        【解决方案18】:

                        在 Windows 10 (Git bash) 中,我不得不使用这个

                        php -d memory_limit=-1 C:\\composer\\composer.phar install
                        

                        【讨论】:

                          【解决方案19】:

                          在以后的作曲家版本中已修复。 在 Windows 上,我必须卸载 composer 然后下载+安装最新版本 https://getcomposer.org/download/

                          现在运行 composer update 工作正常!

                          【讨论】:

                            【解决方案20】:

                            首先,尝试更新作曲家:

                            composer self-update
                            

                            由于某种原因 composer v1.0 不能正常工作,在我的情况下,我必须更新 composer,之后我可以执行:

                            composer update
                            

                            【讨论】:

                              【解决方案21】:

                              在我的情况下,它需要更高的权限以及内存限制的增加。

                              sudo COMPOSER_MEMORY_LIMIT=2G php /opt/bitnami/php/bin/composer.phar update
                              

                              【讨论】:

                              • 使用sudo 运行 Composer 不是一个好主意,因为它会混淆您的权限。这看起来像您在服务器上运行 composer update - 这也是不好的做法,因为它将计算的依赖项置于版本控制之下会变得更加不同
                              • 同意@NicoHaase,你需要非常小心地使用它!谢谢。
                              猜你喜欢
                              • 2019-03-13
                              • 2016-01-22
                              • 1970-01-01
                              • 2020-01-05
                              • 2020-01-24
                              • 2016-06-10
                              • 2017-09-11
                              相关资源
                              最近更新 更多