Ограничение памяти для обновления композитора


96

Мне нужно запустить обновление композитора на моем хостинге, поэтому я вхожу в систему с помощью ssh и пытаюсь выполнить команду:

composer update

внутри папки / www, где у меня установлен Laravel и композитор

но я получаю ошибку:

введите описание изображения здесь

в контакте с моим хостинг-провайдером они говорят мне запустить команду:

php -d memory_limit=512M composer update

Я запускаю эту команду, но получаю: «Не удалось открыть файл: композитор»

Что делать? Какое здесь решение?


2
Как сказал @Sven, в продакшене composer installдостаточно. В вашем случае при использовании виртуального хостинга, я думаю, вы не получите composer updateработы, поэтому единственный способ - купить VPS-хостинг, такой как Digital Ocean, Linode.
Лукас Сильва,

Ответы:


143

При запуске composer updateОС просматривает настроенные пути и пытается найти исполняемый файл с таким именем.

При запуске php composer update, то composerстрока обрабатывается в качестве параметра PHP, который не искал в каких - либо путей. Вы должны указать полный путь, чтобы запустить его.

Запуск which composerсообщит вам, где ОС находит исполняемый файл композитора, а затем вы просто используете полный путь в команде PHP:

$>which composer
/usr/local/bin/composer

$>php -d memory_limit=512M /usr/local/bin/composer update
...

Обратите внимание, что 512 МБ может быть слишком мало. Я считаю, что это займет 1 ГБ или более, в зависимости от количества используемых вами зависимостей и разнообразия версий, которые вы теоретически разрешаете, т.е. если вы разрешаете Symfony ~2.3, тогда вы заставляете Composer работать с гораздо большим количеством возможных версий по сравнению с использованием ~2.7.

Также обратите внимание, что запуск Composer на производственной машине - не лучшая идея. У вас должен быть доступ к Github, возможно, предоставить учетные данные для доступа, установить инструменты VCS, и вы легко сломаете свой сайт, если какой-либо из серверов удаленного хостинга отключен во время вашего обновления. Лучше использовать Composer в системе развертывания, которая выполняет всю подготовку, а затем перемещает все файлы на рабочий сервер.

Обновить

Сейчас 2020 год, и то, как Composer управляет своей памятью, немного изменилось. Самым важным является то, что Composer сам увеличит лимит памяти, если он обнаружит слишком низкий лимит. Однако это немедленно вызывает проблему нехватки памяти на машинах, на которых установлено слишком мало памяти. Вы можете заставить Composer использовать меньше памяти, установив переменную среды как COMPOSER_MEMORY_LIMIT=512M, но это создаст проблемы, если Composer потребуется больше памяти для правильной работы.

Моя основная мысль остается верной: не запускайте Composer на машинах, на которых установлено слишком мало памяти. Возможно, вам понадобится 1,5 ГБ свободной памяти, чтобы иметь возможность обновлять все.


Я просто написал: php -r "readfile (' getcomposer.org/installer' );" | php и после этого все работает нормально ... также СПАСИБО ЗА ПОМОЩЬ
Эндрю

41
php -d memory_limit=-1 $(which composer) updateболее удобен тем, что не нужно указывать путь композитора.
Rax

1
Это замечательно. Я не знал, что можно увеличить память с помощью одной команды. Вот что это делает правильно?
plushyObject

как в windows?
Рэй

1
@Rax еще одна вещь, если вы запускаете эту команду в Windows на mingw, тогда вы получите сообщение об ошибке, что путь должен быть переведен, поэтому используйте эту командуphp -d memory_limit=-1 $(which composer).phar update
Файзан

155

Настройте его на использование столько памяти, сколько он хочет:

COMPOSER_MEMORY_LIMIT=-1 composer update

Как мы можем установить это значение или любое другое значение глобально? вместо того, чтобы делать это каждый раз через интерфейс командной строки?
snh_nl

@snh_nl вам нужно будет установить лимит памяти php. Пример: chapterthree.com/blog/how-fix-composer-memory-issue
jasonflaherty

2
Определите его глобально в вашем / etc / profile (или любой другой оболочке, которую вы используете) COMPOSER_MEMORY_LIMIT=-1; export COMPOSER_MEMORY_LIMIT. Или определить это псевдоним оболочки? 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
Озан Курт

15

Я столкнулся с проблемами с композитором, потому что он потребляет всю доступную память, а затем процесс завершается (на самом деле, выходное сообщение - «Killed»)

Итак, я искал решение для ограничения использования памяти композитора.

Я пробовал (из ответов @Sven)

$ php -d memory_limit=512M /usr/local/bin/composer update

Но это не сработало, потому что

«Композитор внутренне увеличивает memory_limit до 1.5G».

-> С официального сайта композитора.

Затем я нашел команду, которая работает:

$ COMPOSER_MEMORY_LIMIT=512M php composer.phar update

Хотя, в моем случае 512мб мало!

Источник: 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

13

Пришлось совместить 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

Это единственное, что у меня работало на Mac OS X El Capitan.
ymd_ 05


8

Если памяти достаточно, композитор будет использовать ее внутри и работать без проблем. Нет необходимости специально говорить композитору об этом.

Вы пытались увеличить память подкачки, потому что у меня это сработало. Я увеличил объем памяти подкачки до 4096 МБ (4 ГБ), и теперь мне все отлично.

сначала используйте " 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 = 1024 КБ, 2048 КБ или 8096 КБ в зависимости от размера вашего физического тома. используйте команды swapon и swapoff, чтобы увидеть разницу.

проверьте 'swappiness' (60 должно быть хорошо,)

cat /proc/sys/vm/swappiness

5

Вы можете изменить memory_limitзначение в своем php.ini

Попробуйте увеличить лимит в вашем файле php.ini

Используйте -1 для неограниченного или определите явное значение, например 2G

memory_limit = -1

Примечание: Composer внутренне увеличивает memory_limit до 1,5 ГБ.

Прочтите документацию getcomposer.org


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_MEMORY_LIMIT=128MB php composer.phar update

Используйте формат «128M» для мегабайта или «2G» для гигабайта. Вы можете использовать значение «-1», чтобы полностью игнорировать ограничение памяти.

Другой способ - увеличить лимит памяти PHP:

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

2

Я сделал это в Windows 10 и работал со мной:

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

Вы можете изменить значение xx, которое хотите

 memory_limit=XX

1

Насколько велик ваш сервер AWS? Если у него только 1 ГБ оперативной памяти, установка ограничения памяти в 2 ГБ в php.ini не поможет.

Если вы не можете / не хотите также увеличивать серверную часть, чтобы получить больше оперативной памяти, вы также можете включить SWAP.

См. Здесь, как включить свопинг. Он позволяет использовать 4 ГБ, хотя я обычно использую только 1 ГБ.

Источник: Получено с сайта laracast


0

В моем случае ни один из ответов не помог. В конце концов выяснилось, что переход на 64-битную версию PHP (M $ Windows) сразу устранил проблему. Никаких настроек не менял - просто заработало.


0

Я запускаю Laravel 6 с Homestead и тоже столкнулся с этой проблемой. Как предлагается здесь в других ответах, вы можете использовать префикс 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, ознакомьтесь с этим ответом о том, как редактировать файл php.ini с помощью Vim. Файл должен выглядеть примерно так:

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

Обратите внимание, что это может занять бесконечное количество памяти на вашем компьютере. Наверное, не лучшая идея для производства lol. С Laravel Valet пришлось следовать этой статье и обновлять значение памяти здесь:

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

Затем перезапустите сервер с помощью Valet:

valet restart

Этот ответ также был полезен для изменения конфигурации с помощью Laravel Valet на Mac, чтобы изменения вступили в силу.





0

Для Laravel

Шаг 1. Откройте свой терминал

шаг 2. cdв ваш каталог laravel

Шаг 3. Введите команду which composerв каталоге laravel и обратите внимание на каталог, в котором находится композитор.

шаг 4. запустите команду php -d memory_limit=-1 /opt/cpanel/bin/composer update(вы также можете запустить код, если он вам подходит)

(измените /opt/cpanel/bin/composerпуть к каталогу, возвращенный на шаге 3)

Задача решена


0

В Windows 10 (Git bash) мне пришлось использовать это

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

-1

В моем случае требовались более высокие разрешения наряду с увеличением лимита памяти.

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

Запуск Composer с помощью sudo- не лучшая идея, поскольку это приведет к смешиванию ваших разрешений. Похоже, что вы работаете composer updateна сервере - это тоже плохая практика, так как это сделает гораздо более разными, если вычисленные зависимости будут находиться под контролем версий
Нико Хаасе

Согласитесь с @NicoHaase, с этим нужно быть очень осторожным! Благодарю.
Naser Nikzad 03 окт.2020,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.