Обмеження пам’яті для оновлення композитора


85

Мені потрібно запустити оновлення композитора на своєму хостингу, тому я ввійду в систему за допомогою ssh і спробую запустити comand:

composer update

всередині папки / www, де я встановлюю laravel та composer

але я отримую помилку: введіть тут опис зображення

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

php -d memory_limit=512M composer update

Я запускаю цю команду, але отримую: "Не вдалося відкрити файл: композитор"

Що робити? Що тут за солютон?


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

Відповіді:


131

Після запуску 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 і після цього все працює нормально ... також ПОГЛЯД ДО ДОПОМОГИ
Ендрю

34
php -d memory_limit=-1 $(which composer) updateє зручнішим через відсутність необхідності вказувати шлях композитора.
Ракс

1
Це чудово. Я не знав, що ти можеш збільшити пам’ять за одну команду. Це те, що це робить правильно?
plushyObject

як у вікнах?
Рей

1
@Rax ще одна річ, якщо ви виконуєте цю команду у вікнах на mingw, ви отримаєте повідомлення про те, що шлях потрібно перекласти, тому використовуйте цю команду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 (або будь-якій оболонці, яку ви використовуєте) 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

Я стикаюся з проблемами композитора, оскільки він споживає всю доступну пам'ять, а потім процес вбивається (насправді, вихідне повідомлення - "Убитий")

Отже, я шукав рішення щодо обмеження використання композиторської пам'яті.

Я намагався (з відповідей @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

12

Мені довелося комбінувати 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_

Працював у мене, дякую
Сайдіка

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 = 1024k або 2048k або 8096k залежно від вашого фізичного розміру. використовуйте команди 'swapon' і swapoff, щоб побачити різницю.

перевірте "обміненість" (60 повинні робити добре,)

cat /proc/sys/vm/swappiness

4

Ви можете змінити memory_limitзначення у своєму php.ini

Спробуйте збільшити обмеження у вашому файлі php.ini

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

memory_limit = -1

Примітка: Composer внутрішньо збільшує memory_limit до 1,5G.

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


3

На ОС MAC 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-limit.ini як окремий файл. Вам також потрібно оновити обмеження кількості файлів. таким же чином відкрити в текстовому редакторі і змінити на somehting, як 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 ...

1

Наскільки великий ваш aws-сервер? Якщо у нього лише 1 ГБ оперативної пам'яті, встановлення обмеження пам'яті в 2 Гб у php.ini не допоможе.

Якщо ви не можете / не хочете також збільшувати сторону сервера, щоб отримати більше доступної оперативної пам'яті, ви можете також увімкнути SWAP.

Подивіться тут, як увімкнути обмін. Це дозволяє 4 Гб, хоча я зазвичай роблю лише 1 Гб.

Джерело: Отримано з сайту 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

Я запускаю 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

Зверніть увагу, що це може з’їсти нескінченну пам’ять на вашому комп'ютері. Можливо, це не дуже гарна ідея для виробництва, ха-ха. З Laravel Valet довелося дотримуватися цієї статті та оновити значення пам'яті тут:

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

Потім перезапустіть сервер за допомогою Valet:

valet restart

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





-1

У моєму випадку йому потрібні були більш високі дозволи разом із цим збільшенням ліміту пам'яті.

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

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

Погодьтеся з @NicoHaase, потрібно бути настільки обережним, використовуючи це! Дякую.
Насер Нікзад
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.