作曲家更新内存限制


85

我需要在主机上运行composer update,所以我使用ssh登录并尝试运行comand:

composer update

在/ www文件夹中,其中有laravel和composer安装

但我得到错误: 在此处输入图片说明

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

php -d memory_limit=512M composer update

我运行此命令,但得到:“无法打开文件:作曲家”

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


2
正如@Sven所说,在生产中composer install就足够了。就您而言,在使用共享主机时,我认为您将无法使用composer update,因此唯一的方法是购买VPS主机,例如Digital Ocean,Linode。
卢卡斯·席尔瓦

Answers:


131

运行时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使用更少的内存COMPOSER_MEMORY_LIMIT=512M,但是如果Composer需要更多的内存来正确操作,这会造成问题。

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


我只是在想:php -r“ readfile(' getcomposer.org/installer');” | php,之后一切正常...还可以帮助
Andrew

34
php -d memory_limit=-1 $(which composer) update由于无需指定作曲者路径,因此使用起来更加方便。
拉克斯

1
这很棒。我不知道您可以为单个命令增加内存。那是在做什么对吗?
plushyObject

在Windows中如何?

1
@Rax还有一件事情,如果您在mingw上的Windows中运行此命令,则会收到一条错误消息,必须转换路径,因此请使用此命令php -d memory_limit=-1 $(which composer).phar update
Faizan

139

将其设置为使用所需的内存:

COMPOSER_MEMORY_LIMIT=-1 composer update

我们如何设置该值或全局任何值?而不是每次都必须通过CLI执行此操作?
snh_nl

@snh_nl您将需要设置php内存限制。示例:Chapterthree.com/blog/how-fix-composer-memory-issue
jasonflaherty

2
使用/在/ etc / profile(或使用的任何shell)中全局定义它COMPOSER_MEMORY_LIMIT=-1; export COMPOSER_MEMORY_LIMIT。还是将其定义为Shell别名? alias memcomposer='COMPOSER_MEMORY_LIMIT=-1 composer',然后使用memcomposer代替composer
diamondsea

它仍然说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

15

我遇到了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/


1
我不得不使用作曲家像这样:COMPOSER_MEMORY_LIMIT = 1024M作曲家需要“模块”
jasonflaherty

1
类似,我用过COMPOSER_MEMORY_LIMIT=-1 composer require <package name>
realtebo,

12

我不得不结合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上为我工作的唯一软件。
ymd_

为我工作,谢谢
Sayydika

8

如果有足够的内存,作曲家将在内部使用它,并且可以毫无问题地运行。无需专门告诉作曲家这样做。

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

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

对于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


3

在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设置为无限即可。


2

尤其是在更新大型库或具有很多依赖性的库时,可能会发生此错误。作曲家可能会非常消耗内存。

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

php composer.phar --self-update

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

COMPOSER_MEMORY_LIMIT=128MB php composer.phar update

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

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

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

1

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

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

有关如何启用交换的信息,请参见此处它启用了4GB,尽管我自己通常只做1GB。

资料来源:从laracast网站获得


0

就我而言,所有答案都无济于事。最终证明,更改为64位版本的PHP(M $ Windows)立即解决了该问题。我没有更改任何设置-可以正常工作。


0

我在Widnows 10上制作了此文件,并与我合作:

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

您可以更改所需的xx

 memory_limit=XX

0

我在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文件进行编辑时遇到问题,请查看以下有关如何使用Vim编辑php.ini文件的答案。该文件应如下所示:

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

请注意,这可能会耗尽计算机上的无限内存。生产哈哈可能不是一个好主意。使用Laravel Valet必须遵循本文并在此处更新内存值:

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

然后使用Valet重新启动服务器:

valet restart

这个答案对于在Mac上使用Laravel Valet更改配置也很有帮助,这样更改才能生效。


0
<C:\>set COMPOSER_MEMORY_LIMIT=-1
<C:\>composer install exhausted/packages

3
请为您的答案添加一些解释,以便其他人可以从中学习
Nico Haase


0

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

COMPOSER_MEMORY_LIMIT=-1 composer require <package name>

@realtebo提到


-1

就我而言,它需要更高的权限以及内存限制的增加。

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

使用Composer运行sudo不是一个好主意,因为它将混淆您的权限。看来您正在composer update服务器上运行-这也是一种不好的做法,因为将计算出的依赖项置于版本控制之下会大为不同
Nico Haase

同意@NicoHaase,您需要非常小心!谢谢。
Naser Nikzad
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.