【问题标题】:PHP Composer update "cannot allocate memory" error (using Laravel 4)PHP Composer 更新“无法分配内存”错误(使用 Laravel 4)
【发布时间】:2026-02-22 16:15:02
【问题描述】:

我就是解决不了这个问题。

我正在使用 Linode 1G RAM 基本计划。试图通过 Composer 安装一个包,它不让我。我的内存限制在 PHP.ini 上设置为“-1”

我还能做些什么来安装它吗?

Loading composer repositories with package information
Updating dependencies (including require-dev)
  - Installing thujohn/rss (dev-master df80a7d)
    Downloading: 100%         
PHP Fatal error:  Uncaught exception 'ErrorException' with message 'proc_open(): fork failed - Cannot allocate memory' in phar:///usr/local/bin/composer/vendor/symfony/console/Symfony/Component/Console/Application.php:975
Stack trace:
#0 [internal function]: Composer\Util\ErrorHandler::handle(2, 'proc_open(): fo...', 'phar:///usr/loc...', 975, Array)
#1 phar:///usr/local/bin/composer/vendor/symfony/console/Symfony/Component/Console/Application.php(975): proc_open('stty -a | grep ...', Array, NULL, NULL, NULL, Array)
#2 phar:///usr/local/bin/composer/vendor/symfony/console/Symfony/Component/Console/Application.php(853): Symfony\Component\Console\Application->getSttyColumns()
#3 phar:///usr/local/bin/composer/vendor/symfony/console/Symfony/Component/Console/Application.php(818): Symfony\Component\Console\Application->getTerminalDimensions()
#4 phar:///usr/local/bin/composer/vendor/symfony/console/Symfony/Component/Console/Application.php(752): Symfony\Component\Console\Application->getTerminalWidth()
#5 phar:///usr/local/bin/com in phar:///usr/local/bin/composer/vendor/symfony/console/Symfony/Component/Console/Application.php on line 975

Fatal error: Uncaught exception 'ErrorException' with message 'proc_open(): fork failed - Cannot allocate memory' in phar:///usr/local/bin/composer/vendor/symfony/console/Symfony/Component/Console/Application.php:975
Stack trace:
#0 [internal function]: Composer\Util\ErrorHandler::handle(2, 'proc_open(): fo...', 'phar:///usr/loc...', 975, Array)
#1 phar:///usr/local/bin/composer/vendor/symfony/console/Symfony/Component/Console/Application.php(975): proc_open('stty -a | grep ...', Array, NULL, NULL, NULL, Array)
#2 phar:///usr/local/bin/composer/vendor/symfony/console/Symfony/Component/Console/Application.php(853): Symfony\Component\Console\Application->getSttyColumns()
#3 phar:///usr/local/bin/composer/vendor/symfony/console/Symfony/Component/Console/Application.php(818): Symfony\Component\Console\Application->getTerminalDimensions()
#4 phar:///usr/local/bin/composer/vendor/symfony/console/Symfony/Component/Console/Application.php(752): Symfony\Component\Console\Application->getTerminalWidth()
#5 phar:///usr/local/bin/com in phar:///usr/local/bin/composer/vendor/symfony/console/Symfony/Component/Console/Application.php on line 975

【问题讨论】:

    标签: php laravel laravel-4 composer-php


    【解决方案1】:

    这对我有用:

    根据 composer 的文档,Composer 1 使用了更多的内存,升级到最新版本会给你带来更好更快的结果。

    https://getcomposer.org/doc/articles/troubleshooting.md#memory-limit-errors

    【讨论】:

    • 几年前就已经建议了。 *.com/a/32637848
    • @miken32 抱歉,我在这个问题上找不到这个答案,这就是为什么我发布它来帮助遇到同样问题的人
    • @miken32 这里的命令 *.com/a/32637848 不会按照上面发布的作曲家文章链接中的建议更新到作曲家 2
    【解决方案2】:

    我在 wsl2 中使用 composer 时遇到了同样的问题。

    Microsoft WSL 团队引入了一个名为 .wslconfig 的文件,用于调整 WSL2 设置。

    您基本上必须在 %UserProfile%.wslconfig 中创建该文件并设置以下设置。

    [wsl2]
    memory=6GB  # Any size you feel like
    swap=30GB
    localhostForwarding=true
    

    重启你的电脑,从现在开始,你不会再有高内存消耗的问题了。

    希望对您有所帮助!

    【讨论】:

      【解决方案3】:

      我将它用于 500MB RAM,它适用于我。

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

      【讨论】:

        【解决方案4】:

        作为作曲家故障排除指南here 这可能是因为 VPS 内存不足且未启用交换空间。

        free -m
        

        要启用交换,您可以使用例如:

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

        如果上述方法无效,那么您可以尝试创建一个交换文件

        sudo fallocate -l 2G /swapfile
        sudo chmod 600 /swapfile
        sudo mkswap /swapfile
        sudo swapon /swapfile
        

        【讨论】:

        • 非常感谢没有将 php5 升级到 php7 这行得通
        • 它再次给出了错误,但之后运行 composer update 工作正常。
        • 并且可以查看[官方文档][2]getcomposer.org/doc/articles/…
        • 非常感谢。这对我有用。 (Digital Ocean $10 服务器)
        • 设置交换是最好的解决方案。如果你只是用php -dmemory_limit 增加内存,那么如果你的机器没有足够的内存,你仍然会用完内存,除了启用交换之外没有其他办法。
        【解决方案5】:

        就我而言,我尝试了上面列出的所有内容。我使用 Laravel 和 Vagrant,4GB 内存和一个交换空间,内存限制设置为 -1。我删除了 vendor/ 并尝试了其他 PHP 版本。最后,我通过运行管理它工作

        vagrant halt
        vagrant up
        

        然后 composer install 又像往常一样工作了。

        【讨论】:

          【解决方案6】:

          请禁用 js 捆绑并增加内存。那应该解决它。我通过禁用 js 捆绑来修复我的问题。

          谢谢

          【讨论】:

          • 请分享有关您的答案的更多详细信息 - 为什么在下载包时发生错误时禁用“js 捆绑”会有所帮助(发生在任何脚本运行之前)
          【解决方案7】:

          您可以使用以下方法检查您的空闲(交换)内存

          free -m
          
          total used free shared buffers cached
          
          Mem: 2048 357 1690 0 0 237
          -/+ buffers/cache: 119 1928
          Swap: 0 0 0
          

          要启用交换,您可以使用例如:

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

          【讨论】:

          • 我使用free -m 并注意到我没有内存,甚至在交换中也没有.. 然后sudo reboot 并且它工作了
          【解决方案8】:

          我将 PHP memory_limit 从默认的 128M 增加到 512M 并重新启动服务器。这样就解决了问题。

          【讨论】:

          • 不需要重新启动,因为 PHP 不作为服务运行。
          • 不,但是 Apache 可以,因此应该重新启动它才能生效...
          • 它是必需的,因为 apache 会加载 php 模块
          【解决方案9】:

          我尝试删除 vendor 文件夹composer.lock 文件,然后运行命令composer clear-cache,然后运行composer install。所以它工作没有任何错误。

          【讨论】:

            【解决方案10】:
            composer update
            
            Loading composer repositories with package information
            Updating dependencies (including require-dev)
            

            > mmap() 失败:[12] 无法分配内存

            更新服务器上的内存并要求 '4G' 更改 4GB 内存 [尝试更改服务器类型或添加更多内存]

            我们需要编辑的2个文件


            上命令

            # cd /var/www/html
            # nano .htaccess
            

            并将"memory_limit 756M” 编辑为4G


            php 7.0 上的 php ini

            # cd ~
            # php –-ini
            # sudo nano /etc/php-7.0.ini
            

            memory_limit = 128M 到 4G

            #AWS #AMAZONLINUX #MAGENTO2 #PHP7.0

            【讨论】:

            • 请为您的答案添加一些解释。毕竟更改.htaccess 中的任何内容都不会影响composer,因为这不是通过网络服务器运行的
            【解决方案11】:

            以下是解决问题的步骤: (使用即时快速 SWAP 文件分配方法)

            服务器 SWAP 设置(Ubuntu 16.04 SWAP 修复内存不足错误)

            检查你是否已经有交换,内存和磁盘大小:

                sudo swapon -s
                free -m
                df -h
            

            制作交换文件:(如果你想要 4GB SWAP 内存,将 1G 更改为 4G)

                sudo fallocate -l 1G /swapfile 
            

            检查交换文件:

                ls -lh /swapfile
            

            分配交换文件:

                sudo chmod 600 /swapfile
                sudo mkswap /swapfile
                sudo swapon /swapfile
            

            检查交换是否正常,内存和磁盘大小:

                sudo swapon -s
                free -m
                df -h
            

            在系统重启时附加交换文件:

                sudo nano /etc/fstab
                    /swapfile   none    swap    sw    0   0
            

            调整交换文件设置:

                cat /proc/sys/vm/swappiness
                cat /proc/sys/vm/vfs_cache_pressure
            
                sudo sysctl vm.swappiness=10
                sudo sysctl vm.vfs_cache_pressure=50
            
                sudo nano /etc/sysctl.conf
            

            SWAP 文件优先级:(0-100% => 0:不进行交换,100:进行 SWAP 并释放 RAM)

                    vm.swappiness=10
            

            Remove inode from cache:(100:系统从缓存中删除inode信息过快)

                    vm.vfs_cache_pressure = 50
            

            【讨论】:

            • 我不知道最后一步要做什么sudo nano /etc/sysctl.conf,所以,我跳过它然后重新启动Nginx,然后执行composer install(之前我已经删除了供应商目录)它正在工作。谢谢!
            【解决方案12】:

            编辑 php.ini 文件并增加 memory_limit 值。

            memory_limit=1G

            会解决这个问题。

            【讨论】:

              【解决方案13】:

              试试看:

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

              【讨论】:

              • 请在您的答案中添加一些解释,以便其他人可以从中学习 - 特别是:与使用相同方法的其他答案相比,您有什么变化?有没有必要重复他们的答案?
              【解决方案14】:

              看起来你的交换内存用完了, 试试这个

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

              正如@BlackBurn027 在下面的 cmets 上提到的,此解决方案在 here 中进行了描述

              【讨论】:

              • 您先生,真是个天才——这不是 php 问题,删除文件也无济于事。我必须在我的 VPS 上按照你的指示(使用 sudo)。这是对 VPS 所有者唯一有用的答案。
              • 这对我有用,但我很困惑这些命令实际上在做什么,有人可以解释一下吗?
              • 有时 1024 是不够的...改用 2048
              • @JaberAlNahian 您可以进行永久交换,请在此处查看digitalocean.com/community/tutorials/…
              【解决方案15】:

              进行交换并再次运行 composer 命令。我希望它对你有用。

               $ dd if=/dev/zero of=/swapfile bs=1024 count=512k
               $ mkswap /swapfile
               $ swapon /swapfile
               $ echo "/swapfile       none    swap    sw      0       0 " >> /etc/fstab
               $ echo 0 > /proc/sys/vm/swappiness
               $ chown root:root /swapfile
               $ chmod 0600 /swapfile
              

              【讨论】:

                【解决方案16】:

                试试这个:

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

                在 Centos 6 上为我工作

                【讨论】:

                • 这在 AWS Opsworks EC2 实例 Ubuntu 14.04 上对我有用!谢谢!
                【解决方案17】:

                我在 Vagrant 中解决了同样的问题。 我增加了 memory_limit 的值 并删除作曲家缓存:sudo rm -R ~/.composer 最后是 vagrant reload。

                【讨论】:

                  【解决方案18】:

                  我大多数时候都会遇到这种情况,所以通常我会按照设置交换内存的步骤进行操作。

                  但现在我发现了一个对我有用的简单替代技巧。

                  运行 composer update --no-dev@987654322以外的@

                  【讨论】:

                    【解决方案19】:

                    有时通过自我更新作曲家可以解决问题

                    php composer.phar self-update
                    

                    干杯

                    【讨论】:

                    • 这应该是尝试解决问题的第一件事。我有 1.3.3 的问题,自我更新到 1.4.0 解决了这个问题。提示:您可以更新您的答案以涵盖composer self-update 的用例,如果不熟悉作曲家的人阅读此回复。
                    • 发生重命名时获取权限被拒绝
                    【解决方案20】:

                    这是我发现每次都对我有用的解决方法:

                    df -h 
                    dd if=/dev/zero of=/swapfile bs=1M count=1024
                    sudo dd if=/dev/zero of=/swapfile bs=1M count=1024
                    mkswap /swapfile
                    sudo chmod 600 /swapfile
                    sudo mkswap /swapfile
                    sudo swapon /swapfile
                    echo 'echo "/swapfile  none  swap  defaults  0  0" >> /etc/fstab' | sudo sh
                    
                    free -m
                    
                    confirm u see your swap there:
                    total used free shared buffers cached
                    Mem: 494 335 158 0 19 62
                    -/+ buffers/cache: 254 240
                    Swap: 1023 3 1020
                    
                    watch free -m
                    

                    【讨论】:

                    • 哇哇,发布命令而不解释它们的作用可能很危险!尽管我可以肯定地说它适用于大多数系统。基本上,您正在创建分配交换空间,以便 HD 可以用作 RAM。以下是有关如何执行此操作的综合指南,解释了每个命令:digitalocean.com/community/tutorials/…
                    • 感谢您对命令的澄清,很高兴在执行之前知道脚本实际做了什么。但同样,推广数字海洋和教程/博客文章的方式也不好。
                    • 教程很棒,一步一步的讲解!
                    • 谢谢!您的说明帮助我为 1GB RAM 服务器安装 Drupal Presto。我已将 1024 更改为 2048。
                    【解决方案21】:

                    我对 vagrant 也有同样的问题。我通过分配更多内存来修复它。

                     config.vm.provider :virtualbox do |vb|
                          vb.customize ["modifyvm", :id, "--memory", "1024"]
                     end
                    

                    【讨论】:

                    • 也为我解决了这个问题。请注意,在 vagrant 2.x 中,您可以使用 vb.customize ... 而不是 vb.memory = 1024
                    【解决方案22】:

                    我在使用DigitalOcean 托管的最便宜的服务器(512MB RAM)上遇到了类似的问题,我也在同一台服务器上运行 Jenkins CI。在我停止 Jenkins 实例后,composer install 命令起作用了(好吧,在某种程度上,它失败了,除了已经安装之外,还缺少 mcrypt 扩展!)。

                    如果您在服务器上运行了另一个应用程序,也许值得尝试停止它并重新运行命令。

                    【讨论】:

                      【解决方案23】:

                      简单,输入以下命令:

                      rm -rf vendor/

                      rm -rf composer.lock

                      php composer install --prefer-dist

                      应该适用于低内存机器

                      【讨论】:

                      • 为我工作。我在这里写了一个全面的答案 - *.com/questions/26850332/…
                      • 它不工作。这删除了我所有的供应商文件夹。错了!
                      • 删除供应商有什么问题?只需再次运行安装/更新...
                      • 删除供应商并非完全错误,但如果安装仍然无法正常工作,它确实会破坏站点并使其处于损坏状态。但是,不建议删除生产机器上的锁定文件。您应该提交锁定文件并且只安装而不是更新。实际上,通过删除锁定文件,您会强制 Composer 从 json 文件安装,这是内存密集型进程的来源(确定要安装的版本)。
                      • 如果您不在生产环境中,可以按照此操作,因为它会破坏项目,直到 composer 完成安装
                      【解决方案24】:

                      在我的 512mb 主机上更新 php composer.phar 时遇到同样的问题。

                      已解决 php composer.phar install

                      【讨论】:

                        【解决方案25】:

                        有点旧,但以防万一新人正在寻找解决方案,更新您的 PHP 版本可以解决问题。

                        您还应该提交您的 composer.lock 文件并在资源密集型较少的生产环境中安装 composer。

                        更多细节在这里: https://github.com/composer/composer/issues/1898#issuecomment-23453850

                        【讨论】:

                        • 太棒了!那行得通。我没有升级我的 PHP,但提交 composer.lock 文件并正确更新安装了所有东西。谢谢。
                        • 聚会迟到了,但我只是关掉了 Apache 和 MySQL。我使用 512MB RAM VPS 是有原因的,不想花钱。
                        • 更新 PHP 不是解决方案。我有 7.0.21,但仍然出现此错误。
                        • @Kumar 的解决方案对我有用。超级简单,就像大多数事情一样,事后看来很明显:)
                        • 非常感谢。为我节省了很多时间。
                        【解决方案26】:

                        我也遇到过同样的问题。我在一个内存较少的 AWS 免费微实例上。我总是尝试以下选项之一,它总是有效(在所有这些之前,请检查您是否安装了最新版本的作曲家)

                        sudo php -dmemory_limit=750M composer.phar update
                        

                        或删除供应商文件夹的内容并尝试作曲家更新。

                        sudo rm -rf vendor
                        sudo php -dmemory_limit=750M composer.phar update --no-scripts --prefer-dist
                        sudo php artisan --dump-autoload
                        

                        第二个选项尝试更新所有组件,如果没有更新,则从缓存中提取包,否则从 dist 中提取

                        注意:请根据您的选择更改内存限制。

                        创建一个交换分区并尝试。交换分区是 linux 在物理内存用完时用作虚拟内存的硬盘部分。类似于 windows 交换文件,只是不使用实际文件,linux 使用硬盘上的分区。

                        希望对你有帮助

                        【讨论】:

                        • 我将内存限制降低到 500M,composer 安装了我需要的东西。
                        • 您也可以使用实际的交换文件而不是分区。见cyberciti.biz/faq/linux-add-a-swap-file-howto
                        • 我的 Digital Ocean 帐户即使在 250M 也有同样的问题,我还必须先停止 Apache 和 MySQL,然后才能运行它
                        • tristanbailey 您的解决方案有效,谢谢!在我停止 mysql 和 apache 之前,我无法更新,即使设置了 php 内存限制。
                        • 当我运行sudo php -dmemory_limit=750M composer.phar update 时出现此错误Could not open input file: composer.phar 请帮助
                        【解决方案27】:

                        这似乎是 1GB 和更小的服务器实例反复出现的问题。除了尝试关闭进程和调整交换设置之外,您还可以在本地机器上安装并上传。

                        【讨论】:

                        • 是的。有趣的是,如果我删除整个项目,做一个新的 git pull 然后做 composer install,它似乎工作。奇怪。
                        • 令人沮丧,我正在将一些 L4 项目部署到 1GB Linode 实例,现在担心会达到内存上限。
                        • 一个旧链接,但可能有一些用处:github.com/composer/composer/issues/1104
                        • 接受的答案仍然是最好的方法。您应该提交 composer.lock 然后在生产服务器上运行安装而不是更新。