我需要在我的主机上运行 composer update 所以我使用 ssh 登录并尝试在我安装了 Laravel 和 composer 的 /www 文件夹中运行以下命令:
composer update
我收到此错误:
https://i.stack.imgur.com/FGC01.png
我正在与我的托管服务提供商联系,他们告诉我运行命令:
php -d memory_limit=512M composer update
我运行了这个命令,但我得到:“无法打开文件:作曲家”
该怎么办?这里的解决方案是什么?
composer install
就足够了。在您的情况下,在使用共享主机时,我认为您不会让 composer update
工作,所以唯一的方法是购买像 Digital Ocean、Linode 这样的 VPS 主机。
将其设置为使用尽可能多的内存:
COMPOSER_MEMORY_LIMIT=-1 composer update
当您运行 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 -d memory_limit=-1 $(which composer) update
更方便,因为不需要指定作曲家路径。
php -d memory_limit=-1 $(which composer).phar update
对我来说最好的解决方案是
COMPOSER_MEMORY_LIMIT=-1 composer require <package-name>
@realtebo 提到的
我面临着作曲家的问题,因为它消耗了所有可用的内存,然后进程被杀死(实际上,输出消息是“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=-1 composer require <package name>
我必须在命令行中组合 COMPOSER_MEMORY_LIMIT
和 memory_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
set COMPOSER_MEMORY_LIMIT=-1
然后我的 composer 命令在 Windows 上为我工作。
如果有足够的内存,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
您可以更改 php.ini 中的 memory_limit
值
尝试增加 php.ini 文件中的限制
使用 -1 表示无限制或定义明确的值,例如 2G
memory_limit = -1
注意:Composer 在内部将 memory_limit 增加到 1.5G。
阅读文档 getcomposer.org
我在 Windows 10 上做了这个并和我一起工作:
php -d memory_limit=-1 C:/ProgramData/ComposerSetup/bin/composer.phar update
您可以更改所需的 xx 值
memory_limit=XX
在 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 表示无限制。
尤其是当您更新大型库或具有大量依赖项的库时,可能会发生此错误。 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 ...
COMPOSER_MEMORY_LIMIT=-1 composer update --ignore-platform-reqs
你的aws服务器有多大?如果它只有 1gb 的 ram,在 php.ini 中设置 2gb 的内存限制将无济于事。
如果您不能/不想增加服务器端以获得更多可用 RAM,您也可以启用 SWAP。
请参阅此处了解 how to enable swap. 它启用 4GB,尽管我自己通常只使用 1GB。
资料来源:从 laracast 网站获得
我正在使用 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 更改配置,以便更改生效。
<C:\>set COMPOSER_MEMORY_LIMIT=-1
<C:\>composer install exhausted/packages
对于那些使用 Laravel Homestead 的人
写在 Homestead.yaml
variables:
- key: COMPOSER_MEMORY_LIMIT
value: -1
对于 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 中返回的目录路径)
问题解决了
就我而言,没有一个答案有帮助。最后结果证明,更改为 64 位版本的 PHP(M$ Windows)立即解决了这个问题。我没有更改任何设置 - 它只是工作。
转到您的 php ini 文件
设置 memory_limit = -1
在 Windows 10 (Git bash) 中,我不得不使用它
php -d memory_limit=-1 C:\\composer\\composer.phar install
它在以后的作曲家版本中得到了修复。在 Windows 上,我必须卸载 composer 然后下载+安装最新版本 https://getcomposer.org/download/
现在运行 composer update
有效!
首先,尝试更新作曲家:
composer self-update
出于某种原因,composer v1.0 不能正常工作,在我的情况下,我必须更新 composer,之后我可以执行:
composer update
就我而言,它需要更高的权限以及内存限制的增加。
sudo COMPOSER_MEMORY_LIMIT=2G php /opt/bitnami/php/bin/composer.phar update
sudo
运行 Composer 不是一个好主意,因为它会混淆您的权限。这看起来像您在服务器上运行 composer update
- 这也是不好的做法,因为它将计算的依赖项置于版本控制之下会变得更加不同
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