PHP Composer更新“无法分配内存”错误(使用Laravel 4)

194

我真的解决不了这个问题。

我使用的是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
28个回答

449

看起来你的交换空间内存不足了,尝试这个

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

正如在下面的评论中@BlackBurn027提到的,此解决方案在这里被描述。


32
您,先生,是个天才——这不是PHP的问题,删除文件也无济于事。我必须按照您在我的VPS上使用sudo的指示进行操作。对于VPS所有者来说,这是唯一有用的答案。 - Croll
5
如来源所述,本文介绍了有关Composer工具的故障排除技巧,其中包括如何处理"proc_open(): fork failed"错误。 - BlackBurn027
1
这对我有效,但我有点困惑那些命令实际上是在做什么的,能有人解释一下吗? - Joseph Astrahan
4
有时候1024不够用,使用2048代替。 - psylosss
2
如果你来伊朗,请告诉我,我将永远感激你。我会邀请你共进午餐。(顺便说一句,不要来伊朗,这里很危险) - Hossein Shahdoost
显示剩余12条评论

127

作为Composer故障排除指南,这里提到可能是由于VPS内存不足且未启用Swap空间导致的。

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

感谢您,即使没有升级到PHP7,这也起作用了。 - Shadab K
它再次出现了错误,但在运行composer update之后就可以正常工作了。 - Amir Hajiha
你可以查看[官方文档][2]https://getcomposer.org/doc/articles/troubleshooting.md#proc-open-fork-fai%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20led-error - Thilina Dharmasena
非常感谢。这对我很有效。(Digital Ocean $10服务器) - WHY
设置交换空间是最好的解决方案。如果你只是通过 php -dmemory_limit 增加内存,那么如果你的机器没有足够的内存,你仍然会耗尽内存,除了启用交换空间外,没有其他办法可以解决这个问题。 - Oliver P
我曾尝试在EC2实例上安装Git但未成功,后来通过执行命令/sbin/swapon /var/swap.1解决了问题。虽然该命令出现了权限错误,但最终还是起作用了。 - Diego Lins de Freitas

113

14
太棒了!成功了。我没有升级PHP,但是提交composer.lock文件并更新后一切都正常了。谢谢。 - ericbae
7
派对已经结束了,但我只是关闭了Apache和MySQL。我使用512MB RAM的VPS,原因在于我不想花费太多钱。 - Kumar
14
升级PHP并不是解决方案。我已经使用7.0.21版本,但仍然遇到这个错误。 - cj5
@Kumar的解决方案对我很有效。非常简单,就像大多数事情一样,在事后显而易见 :) - James Bridgewater
非常感谢。你帮我省了很多时间。 - JGCW
据我所知,交换文件对SSD硬盘不利。更好的方法是使用更新命令增加memory_limit:运行php -dmemory_limit=750M composer update --no-scripts --prefer-dist。 - Sašo Kovačič

40

我也遇到了同样的问题。我正在使用内存较少的AWS免费微实例。 我总是尝试以下其中一种选项,它总是有效的(在此之前,请检查您是否已安装最新版本的Composer)

sudo php -dmemory_limit=750M composer.phar update

或者删除 vendor 文件夹中的内容,然后尝试运行 composer 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使用的是硬盘上的分区而不是实际文件。
希望这可以帮到您。

1
我将内存限制降低到了500M,然后Composer安装了我所需的内容。 - devNoise
你也可以使用实际的交换文件而不是分区。请参阅http://www.cyberciti.biz/faq/linux-add-a-swap-file-howto/。 - Reese
2
在我的Digital Ocean账户上也遇到了同样的问题,即使在250M的情况下,我也必须先停止Apache和MySQL才能运行它。 - tristanbailey
tristanbailey,你的解决方案很有效,谢谢!在我停止mysql和apache之前,即使设置了php内存限制,我也无法更新。 - Elias Kouskoumvekakis
当我运行 sudo php -dmemory_limit=750M composer.phar update 时,我遇到了这个错误 Could not open input file: composer.phar,请帮忙解决。 - Varun Naharia

16

很简单,输入以下命令:

rm -rf vendor/

rm -rf composer.lock

php composer install --prefer-dist

适用于内存较低的计算机。


对我有用。我在这里写了一个全面的答案 - http://stackoverflow.com/questions/26850332/laravel-composer-update-runs-out-of-memory/26850776#26850776 - halkujabra
1
它不起作用了。而且这删除了我的供应商文件夹。这是错误的! - Vladimir Kovalchuk
删除供应商出现问题了吗?只需要再运行安装/更新即可解决。 - insign
1
删除供应商并不完全是错误的,但如果安装仍然无法正常工作,则会破坏网站并使其处于破碎状态。但是,在生产机器上删除锁定文件是不建议的。您应该提交您的锁定文件并仅安装而不是更新。实际上,通过删除锁定文件,您正在强制Composer从json文件安装,这就是内存密集型进程来自的地方(确定要安装什么版本)。 - Shauna
如果您不在生产环境中,可以按照此操作,因为在安装程序完成之前,它会破坏项目。 - Bizarro

13

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

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

检查您是否已经拥有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: 不放入swap,100: 放到SWAP并释放RAM)

        vm.swappiness=10

移除inode缓存:(100:系统将inode信息从缓存中移除得太快)

        vm.vfs_cache_pressure = 50

我不知道在最后一步sudo nano /etc/sysctl.conf时该做什么,所以我跳过它然后重新启动Nginx,接着运行composer install(之前我已经删除了vendor目录),现在它能够正常工作了。谢谢! - arhakim

10

我在vagrant上遇到了同样的问题。通过分配更多的内存,我解决了这个问题。

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

1
这个问题对我也解决了。请注意,在Vagrant 2.x中,您可以使用vb.memory = 1024代替vb.customize ... - acobster

7

请尝试以下操作:

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

/sbin/mkswap /var/swap.1

/sbin/swapon /var/swap.1

2
请在您的答案中添加一些解释,以便其他人可以从中学习 - 尤其是:与使用相同方法的其他答案相比,您有哪些改变? 是否需要重复他们的答案? - Nico Haase

7

我尝试通过删除vendor文件夹composer.lock文件,然后运行命令composer clear-cachecomposer install。这样就可以无错误地运行了。


7

这是我发现的解决方法,每次都有效:

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

6
哇哇,发布命令而不解释其作用可能很危险!尽管我可以明确地说它适用于大多数系统。基本上,您正在创建并分配交换空间,以便硬盘可以用作内存。这里有一份全面的指南,介绍如何执行此操作并解释每个命令的含义:https://www.digitalocean.com/community/tutorials/how-to-add-swap-on-ubuntu-14-04 - adelriosantiago
感谢您对命令的澄清,了解脚本在执行之前实际执行的操作非常好。但是同样的,您在推广Digital Ocean和您的教程/博客文章时的方式并不好。 - Goran
教程非常棒,逐步展示并附有解释! - Tarik
谢谢!您的指导帮助我在1GB RAM服务器上安装Drupal Presto。我已将1024更改为2048。 - Nikit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接