Обновление PHP Composer «не может выделить память» ошибка (с помощью Laravel 4)

169

Я просто не могу решить это.

Я на Линоде 1G RAM основной план. Попытка установить пакет через Composer, и он не позволяет мне. Мой предел памяти установлен на «-1» на PHP.ini

Что-нибудь еще, что я могу сделать, чтобы установить это?

Loading composer repositories with package information
Updating dependencies (including require-dev)
  - Installing thujohn/rss (dev-master df80a7d)
    Downloading: 100%         
PHP Fatal error:  Uncaught exception 'ErrorException' with message 'proc_open(): fork failed - Cannot allocate memory' in phar:///usr/local/bin/composer/vendor/symfony/console/Symfony/Component/Console/Application.php:975
Stack trace:
#0 [internal function]: Composer\Util\ErrorHandler::handle(2, 'proc_open(): fo...', 'phar:///usr/loc...', 975, Array)
#1 phar:///usr/local/bin/composer/vendor/symfony/console/Symfony/Component/Console/Application.php(975): proc_open('stty -a | grep ...', Array, NULL, NULL, NULL, Array)
#2 phar:///usr/local/bin/composer/vendor/symfony/console/Symfony/Component/Console/Application.php(853): Symfony\Component\Console\Application->getSttyColumns()
#3 phar:///usr/local/bin/composer/vendor/symfony/console/Symfony/Component/Console/Application.php(818): Symfony\Component\Console\Application->getTerminalDimensions()
#4 phar:///usr/local/bin/composer/vendor/symfony/console/Symfony/Component/Console/Application.php(752): Symfony\Component\Console\Application->getTerminalWidth()
#5 phar:///usr/local/bin/com in phar:///usr/local/bin/composer/vendor/symfony/console/Symfony/Component/Console/Application.php on line 975

Fatal error: Uncaught exception 'ErrorException' with message 'proc_open(): fork failed - Cannot allocate memory' in phar:///usr/local/bin/composer/vendor/symfony/console/Symfony/Component/Console/Application.php:975
Stack trace:
#0 [internal function]: Composer\Util\ErrorHandler::handle(2, 'proc_open(): fo...', 'phar:///usr/loc...', 975, Array)
#1 phar:///usr/local/bin/composer/vendor/symfony/console/Symfony/Component/Console/Application.php(975): proc_open('stty -a | grep ...', Array, NULL, NULL, NULL, Array)
#2 phar:///usr/local/bin/composer/vendor/symfony/console/Symfony/Component/Console/Application.php(853): Symfony\Component\Console\Application->getSttyColumns()
#3 phar:///usr/local/bin/composer/vendor/symfony/console/Symfony/Component/Console/Application.php(818): Symfony\Component\Console\Application->getTerminalDimensions()
#4 phar:///usr/local/bin/composer/vendor/symfony/console/Symfony/Component/Console/Application.php(752): Symfony\Component\Console\Application->getTerminalWidth()
#5 phar:///usr/local/bin/com in phar:///usr/local/bin/composer/vendor/symfony/console/Symfony/Component/Console/Application.php on line 975
ericbae
источник

Ответы:

97

Немного устаревший, но на случай, если кто-то новый ищет решение, обновление вашей версии PHP может решить эту проблему.

Также вам следует зафиксировать файл composer.lock и выполнить установку composer в производственной среде, которая требует меньше ресурсов.

Более подробная информация здесь: https://github.com/composer/composer/issues/1898#issuecomment-23453850

fl3x7
источник
12
BRILLIANT! Это сработало. Я не обновил свой PHP, но зафиксировал файл composer.lock и обновил все правильно. Спасибо.
ericbae
6
Поздно до вечеринки, но я просто выключил Apache и MySQL. Есть причина, по которой я использую VPS объемом 512 МБ, я не хочу тратить деньги.
Кумар
11
Обновление PHP не является решением. Я имею 7.0.21, и все еще получаю эту ошибку.
cj5
Решение @ Кумара сработало для меня. Супер просто и, как и большинство вещей, очевидно, задним числом :)
Джеймс Бриджуотер
Большое спасибо. Сэкономил мне кучу времени
Джей Гит
404

Похоже, вам не хватает памяти подкачки, попробуйте это

/bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024
/sbin/mkswap /var/swap.1
/sbin/swapon /var/swap.1

как упомянуто @ BlackBurn027 в комментариях ниже, это решение было описано здесь

Адитья Кресна Пермана
источник
27
Вы, сэр, гений - это не проблема php и удаление файлов не поможет. Я должен следовать вашим инструкциям (с sudo) на моем VPS. Это единственный полезный ответ для владельцев VPS.
Croll
4
getcomposer.org/doc/articles/… как упомянуто источником
BlackBurn027
1
Это сработало для меня, но я запутался, что эти команды на самом деле делают, кто-то может объяснить их?
Джозеф Астрахань
2
иногда 1024 недостаточно ... Используйте вместо 2048
psylosss
1
@JaberAlNahian вы можете сделать постоянный обмен, пожалуйста, проверьте здесь digitalocean.com/community/tutorials/…
Мохаммед Омер
82

Как руководство по устранению неполадок композитора здесь Это может произойти, потому что VPS не хватает памяти и не имеет пространства подкачки включен.

free -m

Чтобы включить обмен, вы можете использовать, например:

sudo /bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024
sudo /sbin/mkswap /var/swap.1
sudo /sbin/swapon /var/swap.1

Или, если выше не работает, то вы можете попробовать создать файл подкачки

sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
Умайр Хамид
источник
большое спасибо без обновления php5 до php7 это сработало
Shadab K
Вы должны запустить его на CLI Linux
Umair Hamid
Это снова выдало ошибку, но запуск обновления композитора после этого работал нормально.
Амир Хаджиха
И вы можете проверить [официальный документ] [2] getcomposer.org/doc/articles/…
Thilina Dharmasena
вещь подкачки сработала для меня.
Виджаянт Катял
38

Я столкнулся с той же проблемой. Я нахожусь на бесплатной микроинстанции AWS, у которой меньше памяти. Я всегда пробую один из приведенных ниже вариантов, и он всегда работает (Перед всем этим, пожалуйста, проверьте, установлена ​​ли у вас последняя версия composer)

sudo php -dmemory_limit=750M composer.phar update

или удалите содержимое папки vendor и попробуйте обновить композитор.

sudo rm -rf vendor
sudo php -dmemory_limit=750M composer.phar update --no-scripts --prefer-dist
sudo php artisan --dump-autoload

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

Примечание: пожалуйста, измените ограничение памяти согласно вашему выбору.

или

Создайте раздел подкачки и попробуйте. Раздел подкачки - это часть жесткого диска, которую Linux использует в качестве виртуальной памяти, когда в ней заканчивается физическая память. Это похоже на файл подкачки Windows вместо того, чтобы использовать настоящий файл, вместо этого Linux использует раздел на жестком диске.

Надеюсь это поможет

Abishek
источник
1
Я опустил лимит памяти до 500M, и композитор установил то, что мне было нужно.
devNoise
Вы также можете использовать реальный файл подкачки вместо раздела. см. cyberciti.biz/faq/linux-add-a-swap-file-howto
rwilson04
2
У меня была такая же проблема на моей учетной записи Digital Ocean даже на 250M, мне также пришлось сначала остановить Apache и MySQL, прежде чем я смог запустить его
tristanbailey
tristanbailey ваше решение сработало, спасибо! До того, как я остановил mysql и apache, я не мог обновить, даже установив ограничение памяти php.
Элиас Кускумвекакис
Когда я бегу, sudo php -dmemory_limit=750M composer.phar update я получаю эту ошибку, Could not open input file: composer.pharпожалуйста, помогите
Варун Нагария
15

Просто введите следующие команды:

rm -rf vendor/

rm -rf composer.lock

php composer install --prefer-dist

Должен работать на машинах с малым объемом памяти

insign
источник
Работал на меня. Я написал исчерпывающий ответ здесь - stackoverflow.com/questions/26850332/…
halkujabra
Это не работает. И это удалило все мои папки продавца. Это не правильно!
Владимир Ковальчук
В чем проблема удалить продавца? просто запустите установку / обновление снова ...
insign
1
Удаление поставщика не является полностью неправильным, хотя оно ломает сайт и сохраняет его в нерабочем состоянии, если установка все еще не работает. Однако удаление файла блокировки на рабочих машинах не рекомендуется. Вы должны фиксировать свой файл блокировки и только устанавливать, а не обновлять. Фактически, удаляя файл блокировки, вы заставляете Composer устанавливать из файла json, откуда происходят процессы, интенсивно использующие память (определяя, какую версию устанавливать).
Шона
Это нормально, если вы не находитесь в производственной среде, так как это нарушит проект, пока композитор не
Bizarro
11

Вот шаги для решения проблемы: (используется метод быстрого и быстрого выделения файлов SWAP)

Настройка SWAP на сервере (Ubuntu 16.04 SWAP исправляет ошибки нехватки памяти)

Проверьте, если у вас уже есть своп, память и размер диска:

    sudo swapon -s
    free -m
    df -h

Создайте файл подкачки: (измените 1G на 4G, если вы хотите 4GB памяти SWAP)

    sudo fallocate -l 1G /swapfile 

Проверьте файл подкачки:

    ls -lh /swapfile

Назначить файл подкачки:

    sudo chmod 600 /swapfile
    sudo mkswap /swapfile
    sudo swapon /swapfile

Проверьте, правильно ли поменены местами память, размер диска и:

    sudo swapon -s
    free -m
    df -h

Прикрепить файл подкачки при перезагрузке системы:

    sudo nano /etc/fstab
        /swapfile   none    swap    sw    0   0

Настройте параметры файла подкачки:

    cat /proc/sys/vm/swappiness
    cat /proc/sys/vm/vfs_cache_pressure

    sudo sysctl vm.swappiness=10
    sudo sysctl vm.vfs_cache_pressure=50

    sudo nano /etc/sysctl.conf

Приоритет файла SWAP: (0-100% => 0: не помещать в своп, 100: ставить SWAP и освобождать оперативную память)

        vm.swappiness=10

Удалить inode из кэша: (100: система слишком быстро удаляет информацию inode из кэша)

        vm.vfs_cache_pressure = 50
Тарик
источник
Я не знаю, что мне делать на последнем шаге sudo nano /etc/sysctl.conf, поэтому я пропускаю его, затем перезапускаю Nginx, а затем делаю composer install(ранее я удалил каталог vendor), и он работает. Спасибо!
Архаким
10

У меня была такая же проблема на бродяге. Я исправил это все больше памяти.

 config.vm.provider :virtualbox do |vb|
      vb.customize ["modifyvm", :id, "--memory", "1024"]
 end
Yann 叶
источник
1
Решил эту проблему и для меня. Обратите внимание, что в vagrant 2.x вместо vb.customize ...вас можно делать vb.memory = 1024.
acobster
10

Пытаться

это в основном повышение памяти подкачки

sudo /bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024 && sudo /sbin/mkswap /var/swap.1 && sudo /sbin/swapon /var/swap.1

Jeidison Farias
источник
6
Пожалуйста, добавьте пояснения к своему ответу, чтобы другие могли извлечь из него урок.
Нико Хаазе
Я согласен, что у этого должно быть больше объяснения, но это работало для меня (это в основном повышение памяти подкачки). Спасибо!
user1015214
8

Попробуй это:

/bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024

/sbin/mkswap /var/swap.1

/sbin/swapon /var/swap.1
Айо Лана
источник
1
Пожалуйста, добавьте некоторые объяснения к вашему ответу, чтобы другие могли извлечь из него урок, особенно: что вы изменили по сравнению с другими ответами, использующими тот же подход? Есть ли необходимость дублировать их ответ?
Нико Хаасе
7

Вот обходной путь, который я нашел, который работает для меня каждый раз:

df -h 
dd if=/dev/zero of=/swapfile bs=1M count=1024
sudo dd if=/dev/zero of=/swapfile bs=1M count=1024
mkswap /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo 'echo "/swapfile  none  swap  defaults  0  0" >> /etc/fstab' | sudo sh

free -m

confirm u see your swap there:
total used free shared buffers cached
Mem: 494 335 158 0 19 62
-/+ buffers/cache: 254 240
Swap: 1023 3 1020

watch free -m
Горан
источник
5
Вау, отправлять команды без объяснения того, что они делают, возможно, опасно! Хотя я могу однозначно сказать, что это будет работать на большинстве систем. В основном вы создаете пространство подкачки, чтобы HD можно было использовать в качестве ОЗУ. Вот полное руководство о том , как сделать это объяснить каждую команду: digitalocean.com/community/tutorials/...
adelriosantiago
Спасибо за разъяснение команд, приятно знать, что на самом деле делает скрипт, прежде чем выполнять его. Но точно так же не очень хорошо, как вы продвигаете digital ocean и свое руководство / пост в блоге.
Горан
Учебник отличный, показывает шаг за шагом с объяснениями!
Тарик
Спасибо! Ваши инструкции помогут мне установить Drupal Presto для 1 ГБ ОЗУ сервера. У меня изменить 1024 до 2048.
Никиты
7

Я попытался, просто удалив папку поставщика и файл composer.lock, а затем я запускаю команду, composer clear-cacheа затем composer install. Так что это работает без каких-либо ошибок.

Манджунатх А
источник
6

Вы можете использовать следующее для проверки вашей свободной (подкачки) памяти

free -m

total used free shared buffers cached

Mem: 2048 357 1690 0 0 237
-/+ buffers/cache: 119 1928
Swap: 0 0 0

Чтобы включить обмен, вы можете использовать, например:

/bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024
/sbin/mkswap /var/swap.1
/sbin/swapon /var/swap.1
Риши Ранджан
источник
Я использовал free -mи заметил, что у меня нет памяти, даже в обмене .. затем сделал, sudo rebootи это сработало
Eleazar
4

Это, кажется, повторяющаяся проблема с 1 ГБ и меньшими экземплярами сервера. Помимо попыток завершить процессы и настроить параметры подкачки, вы можете установить их на локальный компьютер и загрузить.

Makita
источник
1
Ага. Забавно, что, если я удаляю весь проект, делаю свежий git pull, а затем выполняю установку composer, похоже, это работает. Странный.
ericbae
Разочаровывая, я развертываю несколько проектов L4 на инстансах Linode емкостью 1 ГБ и теперь беспокоюсь о достижении потолка памяти.
Макита
Старая ссылка, но может быть полезной
Makita,
2
Принятый ответ по-прежнему лучший путь. Вы должны зафиксировать composer.lock и затем запустить установку вместо обновления на производственном сервере.
Макита
3

Иногда путем самообновления композитора это решает проблему

php composer.phar self-update

ура

Titogelo
источник
Это должно быть первым делом, чтобы попытаться решить проблему. У меня была проблема с 1.3.3, самообновление до 1.4.0 решило проблему. Совет: вы можете обновить свой ответ, чтобы покрыть также случай использования composer self-update, если кто-то, не знакомый с композитором, должен прочитать этот ответ.
Никлаус
получить разрешение отказано, когда происходит переименование
Эндрю
3

Попробуй это:

/bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024
/sbin/mkswap /var/swap.1
/sbin/swapon /var/swap.1

Эта работа для меня на Centos 6

Адоний Васкес
источник
у меня это работало на AWS Opsworks EC2 Instance Ubuntu 14.04! Спасибо!
Пол Прейбиш
3

Я увеличил PHP memory_limitсо 128М до 512М по умолчанию и перезапустил сервер. Это решило проблему.

Арис
источник
3
перезагрузка не требуется, поскольку PHP не работает как сервис.
HelpNeeder
1
Нет, но Apache делает, и поэтому он должен быть перезапущен, чтобы вступить в силу ...
Дедикат
1
это нужно, так как apache загружает модули php
Арис
2

В большинстве случаев я попадаю в эту ситуацию, поэтому обычно я выполнял действия по настройке подкачки памяти.

Но теперь я нашел простой альтернативный трюк, который работал для меня.

Запустить, composer update --no-devкромеcomposer update

Бастин Робин
источник
2

Я решил ту же проблему в Vagrant. Я увеличил значение memory_limit и удалил кеш композитора: sudo rm -R ~ / .composer и, наконец, перегрузил vagrant .

oussaka
источник
1

У меня такая же проблема с обновлением php composer.phar на моем хостинге 512 Мб.

решено с помощью php composer.phar установить

Иван Проскуряков
источник
1

Сделайте своп и снова запустите команду composer. Я надеюсь, что это сработает для вас.

 $ dd if=/dev/zero of=/swapfile bs=1024 count=512k
 $ mkswap /swapfile
 $ swapon /swapfile
 $ echo "/swapfile       none    swap    sw      0       0 " >> /etc/fstab
 $ echo 0 > /proc/sys/vm/swappiness
 $ chown root:root /swapfile
 $ chmod 0600 /swapfile
nixon1333
источник
1

В моем случае я перепробовал все, что было перечислено выше. Я использовал Laravel и Vagrant с 4 ГБ памяти и подкачкой, с пределом памяти, установленным на -1. Я удалил производителя / и попробовал другие PHP-версии. Наконец-то мне это удалось, запустив

vagrant halt
vagrant up

И тогда установка композитора снова заработала как обычно.

PHZ.fi-Фаразон
источник
0

У меня была похожая проблема на самом дешевом сервере (512 МБ ОЗУ), размещенном в DigitalOcean , и я также использовал Jenkins CI на том же сервере. После того, как я остановил экземпляр Jenkins, команда composer install сработала (ну, в некотором смысле, она потерпела неудачу с отсутствующим расширением mcrypt, кроме того, что оно уже установлено!).

Возможно, если на сервере запущено другое приложение, возможно, стоит попытаться остановить его и повторно запустить команду.

Крис
источник
0

Пожалуйста, отключите js-связывание и увеличьте объем памяти. Это должно исправить это. Я исправил мой, отключив JS связывание.

Спасибо

Мани Манн
источник
Пожалуйста, поделитесь более подробной информацией о своем ответе - почему следует отключить справку «js bundling», если при загрузке пакета возникает ошибка (которая происходит задолго до запуска любых сценариев)
Nico Haase
-1

отредактируйте файл php.ini и увеличьте значение memory_limit.

memory_limit = 1G

решит эту проблему.

Amjith
источник
-1
composer update

Loading composer repositories with package information
Updating dependencies (including require-dev)

> mmap () не удалось: [12] Невозможно выделить память

Обновите память на сервере и потребуйте «4G». Измените оперативную память 4 ГБ [попробуйте изменить тип сервера или добавьте больше оперативной памяти].

2 файла нам нужно отредактировать


по команде

# cd /var/www/html
# nano .htaccess

и редактировать "memory_limit 756M”в4G


Php ini на php 7.0

# cd ~
# php –-ini
# sudo nano /etc/php-7.0.ini

memory_limit = 128M до 4G

#AWS #AMAZONLINUX # MAGENTO2 # PHP7.0

оборота SUNNETmedia
источник
1
Пожалуйста, добавьте некоторые объяснения к вашему ответу. В конце концов, изменение чего-либо .htaccessне влияет composer, так как это не выполняется через веб-сервер
Нико Хаас