ChatGPT解决这个技术问题 Extra ChatGPT

Composer 更新内存限制

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

composer update

我收到此错误:

https://i.stack.imgur.com/FGC01.png

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

php -d memory_limit=512M composer update

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

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

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

d
diamondsea

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

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,请尝试增加其内存限制。
p
pfnuesel

当您运行 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 更方便,因为不需要指定作曲家路径。
这很棒。我不知道您可以为单个命令增加内存。这就是这样做对吗?
在windows中如何?
@Rax 还有一件事,如果您在 mingw 上的 Windows 中运行此命令,那么您将收到必须翻译路径的错误,因此请使用此命令 php -d memory_limit=-1 $(which composer).phar update
R
Roman Grinev

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

COMPOSER_MEMORY_LIMIT=-1 composer require <package-name>

@realtebo 提到的


D
Diego Favero

我面临着作曲家的问题,因为它消耗了所有可用的内存,然后进程被杀死(实际上,输出消息是“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 <package name>
E
ESP32

我必须在命令行中组合 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 上为我工作。
A
Arun Panneerselvam

如果有足够的内存,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

V
Vladimir Salguero

您可以更改 php.ini 中的 memory_limit

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

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

memory_limit = -1

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

阅读文档 getcomposer.org


T
Tawfeeq Amro

我在 Windows 10 上做了这个并和我一起工作:

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

您可以更改所需的 xx 值

 memory_limit=XX

M
MadJack

在 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 表示无限制。


S
Snigdha Sambit Aryakumar

尤其是当您更新大型库或具有大量依赖项的库时,可能会发生此错误。 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 ...

v
vinzee
COMPOSER_MEMORY_LIMIT=-1 composer update --ignore-platform-reqs

感谢您的贡献!如果您有时间,请按照 StackOverflow 上的 explain entirely code-based answers 建议编辑答案的解释。
R
Rem

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

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

请参阅此处了解 how to enable swap. 它启用 4GB,尽管我自己通常只使用 1GB。

资料来源:从 laracast 网站获得


C
Connor Leech

我正在使用 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 Valet 必须遵循 this article 并在此处更新内存值:

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

然后用 Valet 重启服务器:

valet restart

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


D
Digital Human
<C:\>set COMPOSER_MEMORY_LIMIT=-1
<C:\>composer install exhausted/packages

请在您的答案中添加一些解释,以便其他人可以从中学习
a
alvaro.canepa

对于那些使用 Laravel Homestead 的人

写在 Homestead.yaml

variables:
    - key: COMPOSER_MEMORY_LIMIT
      value: -1

O
Obot Ernest

对于 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 更改为步骤 3 中返回的目录路径)

问题解决了


E
ESP32

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


您能解释一下如何将 php 版本从 32 位更改为 64 位吗?
@HaritsinhGohil 只需从 php.net/downloads.php 下载 64 位版本,重命名您的 32 位文件夹并将 64 位版本复制到旧版本名称的文件夹中。
D
Dinush Chathurya

转到您的 php ini 文件

设置 memory_limit = -1


K
Khalifa

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

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

A
Andrew

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

现在运行 composer update 有效!


F
Fischer Tirado

首先,尝试更新作曲家:

composer self-update

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

composer update

N
Naser Nikzad

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

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

使用 sudo 运行 Composer 不是一个好主意,因为它会混淆您的权限。这看起来像您在服务器上运行 composer update - 这也是不好的做法,因为它将计算的依赖项置于版本控制之下会变得更加不同
同意@NicoHaase,你需要非常小心地使用它!谢谢。