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


167

我只是无法解决这个问题。

我正在使用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

Answers:


96

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

另外,您应该提交composer.lock文件,并在资源占用较少的生产环境中进行composer安装。

此处有更多详细信息:https : //github.com/composer/composer/issues/1898#issuecomment-23453850


12
辉煌!那行得通。我没有升级我的PHP,但是提交了composer.lock文件并更新了所有安装程序。谢谢。
ericbae

6
晚了,但是我只是关闭了Apache和MySQL。我使用512MB RAM VPS是有原因的,不想花钱。
Kumar

11
更新PHP不是解决方案。我有7.0.21,仍然出现此错误。
cj5

@Kumar的解决方案为我工作。超级容易,就像大多数事情一样,事后看来很明显:)
James Bridgewater

非常感谢。节省了我很多时间。
杰伊·盖斯

404

看起来您的交换内存用完了,试试看

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

如@ BlackBurn027在下面的评论中提到的,此解决方案在此处进行了描述


27
您长官,是个天才-它不是php问题,删除文件无济于事。我必须在VPS上按照您的指示(使用sudo)。对于VPS所有者,这是唯一有用的答案。
2015年


1
这对我有用,但是我很困惑那些命令的实际作用,有人可以解释它们吗?
约瑟夫·阿斯特拉罕

2
有时1024还不够...请改用2048
psylosss

1
@JaberAlNahian你可以做一个永久的交换请点击这里 digitalocean.com/community/tutorials/...
穆罕默德·奥马尔

78

作为作曲家的疑难解答指南 这可能是由于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工作
Shadabķ

你必须在Linux的命令行运行它
Umair哈米德

它再次给出了错误,但是在此之后运行composer update很好。
阿米尔·哈吉哈


38

我也遇到过同样的问题。我正在使用内存较少的AWS Free Microinstance。我总是尝试使用以下选项之一,并且它始终有效(在进行所有操作之前,请检查您是否安装了最新版本的composer)

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使用硬盘驱动器上的分区。

希望这可以帮助


1
我将内存限制降低到500M,并且composer安装了所需的软件。
devNoise 2013年

您还可以使用实际的交换文件代替分区。参见cyberciti.biz/faq/linux-add-a-swap-file-howto
rwilson04 2013年

2
即使在2.5M上,我的Digital Ocean帐户也遇到了同样的问题,我还必须先停止Apache和MySQL,然后才能运行它
tristanbailey 2014年

tristanbailey您的解决方案有效,谢谢!在我停止mysql和apache之前,即使设置php内存限制,我也无法更新。
Elias Kouskoumvekakis 2015年

运行时sudo php -dmemory_limit=750M composer.phar update 出现此错误,Could not open input file: composer.phar请帮忙
Varun Naharia

15

轻松键入以下命令:

rm -rf vendor/

rm -rf composer.lock

php composer install --prefer-dist

应该适用于低内存机器


为我工作。我写了一个全面的答案在这里- stackoverflow.com/questions/26850332/...
halkujabra

没用 而这删除了我所有的供应商文件夹。这是不对的!
弗拉基米尔·科瓦尔丘克

删除供应商有什么问题?只需再次运行安装/更新...
2016年

1
删除供应商并不是完全错误,尽管它确实会破坏站点并在安装仍然无法进行的情况下将站点保持在破坏状态。但是,建议不要在生产计算机上删除锁定文件。您应该提交锁定文件,并且仅安装而不是更新。实际上,通过删除锁定文件,您将迫使Composer从json文件进行安装,而json文件是内存密集型进程的来源(确定要安装哪个版本)。
莎娜

如果您不在生产环境中,则可以遵循此步骤,因为它会中断项目,直到完成作曲家的安装为止
Bizarro

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

从缓存中删除索引节点:(100:系统太快地从缓存中删除索引节点信息)

        vm.vfs_cache_pressure = 50

我不知道我在下一步中必须做什么sudo nano /etc/sysctl.conf,因此,我跳过了该步骤,然后重新启动Nginx,然后执行了此操作composer install(以前我已经删除了供应商目录),并且可以正常工作。谢谢!
arhakim

10

我在流浪汉上也有同样的问题。我通过分配更多内存来修复它。

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

1
我也解决了这个问题。请注意,在流浪汉2.x中,vb.customize ...您可以这样做vb.memory = 1024
acobster

10

尝试

基本上是在增加交换内存

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


6
请在回答中添加一些解释,以便其他人可以从中学习。
Nico Haase

我同意这应该有更多的解释,但是对我有用(它基本上提高了交换内存)。谢谢!
user1015214

8

试试看:

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

/sbin/mkswap /var/swap.1

/sbin/swapon /var/swap.1

1
请在您的答案中添加一些解释,以便其他人可以从中了解到-特别是:与使用相同方法的其他答案相比,您做了哪些更改?是否需要重复他们的答案?
Nico Haase

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

5
哇,发布命令而不解释它们的作用可能很危险!尽管我可以肯定地说它可以在大多数系统上运行。基本上,您正在创建分配交换空间,以便HD可用作RAM。这是有关如何执行每个命令的综合指南:digitalocean.com/community/tutorials/…–
adelriosantiago

感谢您对命令的澄清,很高兴在执行脚本之前了解脚本的实际操作。但是同样地,如何推广数字海洋和教程/博客文章也不是一件好事。
Goran 2015年

该教程很棒,它一步一步地显示了解释!
塔里克

谢谢!您的说明可帮助我为1GB RAM服务器安装Drupal Presto。我将1024更改为
2048。– Nikit,

7

我尝试通过只删除供应商文件夹composer.lock文件,然后运行命令composer clear-cache,然后执行composer install。因此它可以正常工作。


6

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

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,它起作用了
Eleazar Resendez 19/12/8

4

对于1GB和较小的服务器实例,这似乎是一个经常发生的问题。除了尝试关闭进程和调整交换设置外,您还可以安装在本地计算机上并上载。


1
是的 有趣的是,如果我删除整个项目,执行一个新的git pull,然后再进行composer安装,那似乎就可以了。奇怪。
ericbae

令人沮丧的是,我正在将几个L4项目部署到1GB Linode实例,现在担心达到内存上限。
牧田

一个旧的链接,但可能有一些用处:github.com/composer/composer/issues/1104
Makita

2
公认的答案仍然是最好的方法。您应该提交composer.lock,然后在生产服务器上运行安装而不是更新。
牧田

3

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

php composer.phar self-update

干杯


这应该是尝试解决此问题的第一件事。我在1.3.3上遇到问题,自我更新到1.4.0后解决了该问题。提示:composer self-update如果对作曲家不太熟悉的人正在阅读此答复,则可以更新答案以涵盖的用例。
Niklaus

重命名发生时,获取权限被拒绝
安德鲁(Andrew)


3

我将PHP memory_limit从默认的128M增加到512M,然后重新启动服务器。那解决了问题。


3
不需要重新启动,因为PHP不能作为服务运行。
HelpNeeder

1
不,但是Apache可以,因此应该重新启动它才能生效...

1
这是需要的,因为apache会加载php模块
Aris

2

我通常会遇到这种情况,因此通常我会遵循设置交换内存的步骤。

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

运行 composer update --no-devcomposer update


2

我在Vagrant中解决了相同的问题。我增加了memory_limit的值 并删除了作曲家缓存:sudo rm -R〜/ .composer ,最后重新加载了流浪汉。



1

进行交换并再次运行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

1

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

vagrant halt
vagrant up

然后,作曲家的安装仍照常进行。


0

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

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


0

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

谢谢


请分享您的答案的更多详细信息-下载包时发生错误(为什么在运行任何脚本之前发生),为什么应禁用“ js捆绑”帮助
Nico Haase

-1

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

memory_limit = 1G

将解决此问题。


-1
composer update

Loading composer repositories with package information
Updating dependencies (including require-dev)

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

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

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


1
请在回答中添加一些解释。毕竟,更改任何内容.htaccess都不会影响composer,因为这不会通过Web服务器运行
Nico Haase
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.