PHP Fatal error: Allowed memory size of 1610612736 bytes exhausted (tried to allocate 4096 bytes)
#Откуда берётся нехватка памяти
Composer решает задачу выбора совместимых версий всех пакетов (SAT-решатель). На проекте с десятками зависимостей и широкими ограничениями вроде "*" ему нужно загрузить метаданные тысяч версий, и 128–512 МБ быстро заканчиваются. Особенно часто это случается на дешёвых VPS с 512–1024 МБ, где память делят PHP, база и веб-сервер, а ядро убивает процесс по OOM, если swap нет.
#Быстрое решение
Первым делом снимите лимит PHP именно для Composer. Переменная окружения действует только на этот запуск и ничего не меняет в настройках сервера:
composer diagnosecomposer install --dry-run# Не отключайте ограничение памяти и не пересчитывайте зависимости без диагностики.composer --version# На Windows не запускайте update с отключённым лимитом без измерения RAM.Если вместо этого вы запускаете php composer.phar, используйте ключ -d: php -d memory_limit=-1 composer.phar update. Узнать, какой php-файл настроек читает консольный PHP и какой лимит стоит, можно так:
php --iniphp -r "echo ini_get('memory_limit'), PHP_EOL;"#Если памяти физически мало
Лимит -1 не добавит оперативной памяти. Если на сервере 512 МБ, процесс будет убит ядром, и в выводе появится только «Killed». Проверьте это и создайте swap-файл на 1–2 ГБ:
free -msudo dmesg | grep -i "out of memory" | tail -3free -h# Добавление swap меняет разметку использования диска; согласуйте его с администратором.Команда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
#Как уменьшить аппетит Composer
- Обновите сам ComposerОткройте терминал в корне PHP-проекта и выполните
composer --version, затем сравните установленную версию с требованиями проекта. Устаревший Composer 1 может вести себя иначе, но повышение версии не исправляет реальную нехватку RAM. Прежде чем обновлять Composer, сохранитеcomposer.json,composer.lockи убедитесь, что репозиторий доступен. - Ставьте из lock-файлаЕсли в проекте уже есть
composer.lock, для установки на сервер используйтеcomposer installс подходящими опциями, а неcomposer update, который разрешает новые версии и может менять зависимости. Проверьте, достаточно ли свободной памяти и выполняется ли команда под пользователем проекта. - Обновляйте точечноЕсли нужен один пакет, обновляйте только его и необходимые зависимости в тестовом окружении вместо пересчёта всего дерева. После установки проверьте работу проекта, а изменённый
composer.lockфиксируйте в системе контроля версий. Не запускайтеCOMPOSER_MEMORY_LIMIT=-1как универсальный обход. - Сузьте ограничения версийКогда Composer сообщает о конфликте ограничений версий, выполните
composer why-not vendor/package 3.0илиcomposer update --dry-run -vvvс реальным именем пакета, чтобы понять требование. Не ослабляйте массово версии библиотек до диапазона*, так можно поставить несовместимые или уязвимые релизы. - Не собирайте проект на слабом сервереЕсли сервер маломощный, соберите зависимости в окружении с подходящей версией PHP и перенесите артефакты по штатному процессу развёртывания. Убедитесь, что расширения и архитектура рабочего сервера совместимы; ручное копирование
vendorбез контроля версий может сломать автозагрузку. - Диагностика: почему Composer выбрал именно эти версииLinux · Терминал (Bash)КомандаДиагностика: почему Composer выбрал именно эти версии
composer why-not vendor/package 3.0composer update --dry-run -vvv
Если после этого ошибка остаётся, а лимит уже снят, значит нужен swap или сборка не на этой машине.