Błąd „nie można przydzielić pamięci” podczas aktualizacji PHP Composer (przy użyciu Laravel 4)


169

Po prostu nie mogę tego rozwiązać.

Jestem na podstawowym planie Linode 1G RAM. Próbuję zainstalować pakiet przez Composer, ale mi na to nie pozwala. Mój limit pamięci jest ustawiony na „-1” w PHP.ini

Czy jest coś jeszcze, co mogę zrobić, aby to zainstalować?

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

Odpowiedzi:


97

Trochę stary, ale na wypadek, gdyby ktoś nowy szukał rozwiązania, aktualizacja wersji PHP może rozwiązać problem.

Powinieneś także zatwierdzić plik composer.lock i przeprowadzić instalację kompozytora w środowisku produkcyjnym, które wymaga mniej zasobów.

Więcej szczegółów tutaj: https://github.com/composer/composer/issues/1898#issuecomment-23453850


12
ZNAKOMITY! To się udało. Nie zaktualizowałem swojego PHP, ale wysłałem plik composer.lock i zaktualizowałem wszystko poprawnie. Dziękuję Ci.
ericbae

6
Spóźniłem się na imprezę, ale po prostu wyłączyłem Apache i MySQL. Jest powód, dla którego używam 512 MB RAM VPS, nie chcę wydawać pieniędzy.
Kumar

11
Aktualizacja PHP nie jest rozwiązaniem. Mam 7.0.21 i nadal otrzymuję ten błąd.
cj5

Rozwiązanie @ Kumar zadziałało dla mnie. Super łatwe i jak większość rzeczy, z perspektywy czasu oczywiste :)
James Bridgewater

Wielkie dzięki. Zaoszczędziło mi to sporo czasu.
Jay Geeth

404

Wygląda na to, że zabrakło pamięci wymiany, spróbuj tego

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

jak wspomniał @ BlackBurn027 w komentarzach poniżej, to rozwiązanie zostało opisane tutaj


27
Pan jest geniuszem - to nie jest problem z php, a usuwanie plików nie pomoże. Muszę postępować zgodnie z twoimi instrukcjami (z sudo) na moim VPS. To jedyna przydatna odpowiedź dla właścicieli VPS.
Croll

4
getcomposer.org/doc/articles/… jak wspomniało źródło
BlackBurn027

1
To zadziałało dla mnie, ale jestem zdezorientowany, co właściwie robią te polecenia, czy ktoś może je wyjaśnić?
Joseph Astrahan

2
czasami 1024 to za mało ... Zamiast tego użyj 2048
psylosss

1
@JaberAlNahian możesz dokonać trwałej zamiany, sprawdź tutaj digitalocean.com/community/tutorials/ ...
Mohammed Omer

79

Jako przewodnik rozwiązywania problemów kompozytora tutaj To może się dziać, ponieważ VPS zabraknie pamięci i ma swap włączony.

free -m

Aby włączyć zamianę, możesz użyć na przykład:

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

Lub jeśli powyższe nie zadziałało, możesz spróbować utworzyć plik wymiany

sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

wielkie dzięki bez aktualizacji php5 do php7 to zadziałało
Shadab K

Musisz go uruchomić na CLI Linuksa
Umair Hamid,

Ponownie wystąpił błąd, ale późniejsza aktualizacja kompozytora działała poprawnie.
Amir Hajiha

Możesz też sprawdzić [oficjalny dokument] [2] getcomposer.org/doc/articles/ ...
Thilina Dharmasena

38

Zmierzyłem się z tym samym problemem. Korzystam z darmowej mikroinstancji AWS, która ma mniej pamięci. Zawsze próbuję jednej z poniższych opcji i zawsze działa (przed tym wszystkim sprawdź, czy masz zainstalowaną najnowszą wersję kompozytora)

sudo php -dmemory_limit=750M composer.phar update

lub usuń zawartość folderu dostawcy i wypróbuj aktualizację kompozytora.

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

Druga opcja próbuje zaktualizować wszystkie komponenty, jeśli nie ma aktualizacji, pobiera pakiet z pamięci podręcznej, w przeciwnym razie odbiera z dyst

Uwaga: Zmień limit pamięci zgodnie z własnym wyborem.

lub

Utwórz partycję wymiany i spróbuj. Partycja wymiany to część dysku twardego, której Linux używa jako pamięci wirtualnej, gdy zabraknie pamięci fizycznej. Jest podobny do pliku wymiany systemu Windows, tylko zamiast używać rzeczywistego pliku, linux używa zamiast tego partycji na dysku twardym.

Mam nadzieję że to pomoże


1
Zmniejszyłem limit pamięci do 500M i Composer zainstalował to, czego potrzebowałem.
devNoise,

możesz także użyć rzeczywistego pliku wymiany zamiast partycji. patrz cyberciti.biz/faq/linux-add-a-swap-file-howto
rwilson04

2
Miałem ten sam problem na moim koncie Digital Ocean nawet przy 250M, musiałem też najpierw zatrzymać Apache i MySQL, zanim mogłem go uruchomić
tristanbailey

tristanbailey Twoje rozwiązanie zadziałało, dzięki! Zanim zatrzymałem mysql i apache, nie mogłem zaktualizować, nawet ustawiając limit pamięci php.
Elias Kouskoumvekakis

Po uruchomieniu sudo php -dmemory_limit=750M composer.phar update pojawił się ten błąd, Could not open input file: composer.pharproszę o pomoc
Varun Naharia

15

Łatwo, wpisz następujące polecenia:

rm -rf vendor/

rm -rf composer.lock

php composer install --prefer-dist

Powinien działać na komputerach z małą ilością pamięci


Pracował dla mnie. Napisałem tutaj wyczerpującą odpowiedź - stackoverflow.com/questions/26850332/…
halkujabra

To nie działa. I to usunęło cały mój folder dostawcy. To jest źle!
Vladimir Kovalchuk

Jaki jest problem z usunięciem dostawcy? po prostu uruchom ponownie instalację / aktualizację ...
insign

1
Usunięcie dostawcy nie jest całkowicie błędne, chociaż powoduje uszkodzenie witryny i utrzymuje ją w stanie zepsutym, jeśli instalacja nadal nie działa. Nie zaleca się jednak usuwania pliku blokady na maszynach produkcyjnych. Powinieneś zatwierdzić plik blokady i tylko instalować, a nie aktualizować. W rzeczywistości, usuwając plik blokady, zmuszasz Composera do instalacji z pliku json, z którego pochodzą procesy wymagające dużej ilości pamięci (określające, którą wersję instalacji).
Shauna

Możesz postępować zgodnie z tym, jeśli nie jesteś w środowisku produkcyjnym, ponieważ spowoduje to przerwanie projektu, dopóki kompozytor nie skończy instalacji
Bizarro

11

Oto kroki umożliwiające rozwiązanie problemu: (użyto natychmiastowej, szybkiej metody alokacji plików SWAP)

Konfiguracja SWAP serwera (Ubuntu 16.04 SWAP do naprawy błędów braku pamięci)

Sprawdź, czy masz już swap, pamięć i rozmiar dysku:

    sudo swapon -s
    free -m
    df -h

Utwórz plik wymiany: (zmień 1G na 4G, jeśli chcesz 4 GB pamięci SWAP)

    sudo fallocate -l 1G /swapfile 

Sprawdź plik wymiany:

    ls -lh /swapfile

Przypisz plik wymiany:

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

Sprawdź, czy wymiana jest OK, pamięć i rozmiar dysku:

    sudo swapon -s
    free -m
    df -h

Dołącz plik wymiany przy ponownym uruchomieniu systemu:

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

Dostosuj ustawienia pliku wymiany:

    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

Priorytet pliku SWAP: (0-100% => 0: nie wymieniaj, 100: włącz SWAP i zwolnij pamięć RAM)

        vm.swappiness=10

Usuń i-węzeł z pamięci podręcznej: (100: system zbyt szybko usuwa informacje i-węzła z pamięci podręcznej)

        vm.vfs_cache_pressure = 50

Nie wiem, co mam zrobić na ostatnim kroku sudo nano /etc/sysctl.conf, więc pomijam to, ponownie uruchamiam Nginx, a następnie robię composer install(wcześniej usunąłem katalog dostawcy) i działa. Dzięki!
arhakim

10

Miałem ten sam problem z włóczęgą. Naprawiłem to, dodając więcej pamięci.

 config.vm.provider :virtualbox do |vb|
      vb.customize ["modifyvm", :id, "--memory", "1024"]
 end

1
Rozwiązałem również ten problem dla mnie. Zauważ, że w vagrant 2.x zamiast tego vb.customize ...możesz to zrobić vb.memory = 1024.
acobster

10

Próbować

po prostu zwiększa pamięć wymiany

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


6
Dodaj wyjaśnienie do swojej odpowiedzi, aby inni mogli się z niej nauczyć.
Nico Haase,

Zgadzam się, że powinno to mieć więcej wyjaśnień, ale zadziałało dla mnie (zasadniczo zwiększa pamięć wymiany). Dzięki!
user1015214

8

Spróbuj tego:

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

/sbin/mkswap /var/swap.1

/sbin/swapon /var/swap.1

1
Dodaj wyjaśnienie do swojej odpowiedzi, tak aby inni mogli się z niej nauczyć - zwłaszcza: co zmieniłeś w porównaniu z innymi odpowiedziami, w których zastosowano to samo podejście? Czy istnieje potrzeba powtórzenia ich odpowiedzi?
Nico Haase

7

Oto obejście, które znalazłem, które działa dla mnie za każdym razem:

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
Wowwow, publikowanie poleceń bez wyjaśnienia, co robią, jest prawdopodobnie niebezpieczne! Chociaż mogę definitywnie powiedzieć, że zadziałaby na większości systemów. Zasadniczo tworzysz alokację przestrzeni wymiany, aby dysk HD mógł być używany jako pamięć RAM. Oto kompleksowy poradnik jak to zrobić tłumacząc każdego polecenia: digitalocean.com/community/tutorials/...
adelriosantiago

Dziękuję za wyjaśnienie poleceń, dobrze jest wiedzieć, co właściwie robi skrypt, zanim go wykonasz. Ale w ten sam sposób nie jest fajnie, jak promujesz cyfrowy ocean i swój tutorial / post na blogu.
Goran

Samouczek jest świetny, pokazując krok po kroku z objaśnieniami!
Tarik

Dziękuję Ci! Twoje instrukcje pomogą mi zainstalować Drupal Presto dla serwera 1GB RAM. Mam zmianę z 1024 na 2048.
Nikit

7

Próbowałem, po prostu usuwając folder dostawcy i plik composer.lock , a następnie uruchamiam polecenie composer clear-cachei wtedy composer install. Więc działa bez żadnego błędu.


6

możesz skorzystać z poniższych, aby sprawdzić swoją wolną (zamienić) pamięć

free -m

total used free shared buffers cached

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

Aby włączyć zamianę, możesz użyć na przykład:

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

Użyłem free -mi zauważyłem, że nie mam pamięci, nawet w zamianie .. potem zrobiłem sudo rebooti zadziałało
Eleazar Resendez

4

Wydaje się, że jest to powtarzający się problem z 1 GB i mniejszymi instancjami serwera. Oprócz próby zamknięcia procesów i zmiany ustawień wymiany, możesz zainstalować na komputerze lokalnym i przesłać.


1
tak. Zabawne jest to, że jeśli usunę cały projekt, zrobię nowy git pull, a następnie zainstaluję kompozytor, wydaje się, że działa. Dziwne.
ericbae

Frustrujące jest to, że wdrażam kilka projektów L4 w instancjach Linode o pojemności 1 GB i teraz martwię się, że przekroczę pułap pamięci.
Makita

Stary link, ale może się przydać
Makita

2
Przyjęta odpowiedź jest nadal najlepszą drogą. Należy zatwierdzić plik composer.lock, a następnie uruchomić instalację zamiast aktualizacji na serwerze produkcyjnym.
Makita

3

Czasami samoczynnie aktualizując kompozytor rozwiązuje problem

php composer.phar self-update

Twoje zdrowie


To powinna być pierwsza rzecz, którą należy podjąć, aby rozwiązać problem. Miałem problem z 1.3.3, samodzielna aktualizacja do 1.4.0 rozwiązała problem. Wskazówka: możesz zaktualizować swoją odpowiedź, aby obejmowała również przypadek użycia composer self-update, jeśli ktoś niezbyt zaznajomiony z kompozytorem ma przeczytać tę odpowiedź.
Niklaus,

odmowa pozwolenia na zmianę nazwy
Andrew

3

Spróbuj tego:

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

Ta praca dla mnie na Centos 6


to zadziałało dla mnie na AWS Opsworks EC2 Instance Ubuntu 14.04! Dzięki!
Paul Preibisch

3

Zwiększyłem PHP memory_limitz domyślnych 128M do 512M i zrestartowałem serwer. To rozwiązało problem.


3
ponowne uruchomienie nie powinno być potrzebne, ponieważ PHP nie działa jako usługa.
HelpNeeder

1
Nie, ale Apache to robi i dlatego należy go ponownie uruchomić, aby
zaczął

1
jest to potrzebne, ponieważ apache ładuje moduły php
Aris

2

W większości przypadków wpadam w tę sytuację, więc zwykle postępowałem zgodnie z krokiem ustawiania pamięci wymiany.

Ale teraz znalazłem prostą alternatywną sztuczkę, która zadziałała dla mnie.

Uruchom composer update --no-devinne niżcomposer update


2

Rozwiązałem ten sam problem w Vagrant. Zwiększyłem wartość memory_limit i usunąłem pamięć podręczną kompozytora: sudo rm -R ~ / .composer i wreszcie vagrant reload.


1

mam ten sam problem z aktualizacją php composer.phar na moim hostingu 512 MB.

rozwiązany za pomocą php composer.phar install


1

Dokonaj zamiany i ponownie uruchom polecenie Composer. Mam nadzieję, że to zadziała.

 $ 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

1

W moim przypadku wypróbowałem wszystko, co zostało wymienione powyżej. Używałem Laravela i Vagranta z 4 GB pamięci i wymianą, z limitem pamięci ustawionym na -1. Usunąłem dostawcę / i wypróbowałem inne wersje PHP. Wreszcie udało mi się to działać, biegając

vagrant halt
vagrant up

Następnie instalacja kompozytora działała ponownie jak zwykle.


0

Podobny problem miałem na najtańszym serwerze (512MB RAM) hostowanym przez DigitalOcean , a na tym samym serwerze korzystałem również z Jenkins CI. Po zatrzymaniu instancji Jenkinsa polecenie instalacji kompozytora zadziałało (cóż, do pewnego momentu nie udało się to z powodu braku rozszerzenia mcrypt, poza tym, że zostało już zainstalowane!).

Może jeśli na serwerze działa inna aplikacja, może warto spróbować ją zatrzymać i ponownie uruchomić polecenie.


0

Wyłącz pakietowanie js i zwiększ pamięć. To powinno to naprawić. Naprawiłem mój, wyłączając pakietowanie js.

Dzięki


Proszę podać więcej szczegółów na temat swojej odpowiedzi - dlaczego wyłączenie „js bundling” powinno pomóc, gdy wystąpi błąd podczas pobierania pakietu (co ma miejsce na długo przed uruchomieniem jakichkolwiek skryptów)
Nico Haase

-1

edytuj plik php.ini i zwiększ wartość memory_limit.

memory_limit = 1G

rozwiąże ten problem.


-1
composer update

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

> mmap () nie powiodło się: [12] Nie można przydzielić pamięci

Zaktualizuj pamięć na serwerze i wymagaj „4G” Zmień 4 GB pamięci RAM [spróbuj zmienić typ serwera lub dodaj więcej pamięci RAM]

2 Pliki Musimy edytować


na komendę

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

i edytuj "memory_limit 756M”w4G


PHP ini na php 7.0

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

memory_limit = 128 M do 4G

#AWS #AMAZONLINUX # MAGENTO2 # PHP7.0


1
Dodaj wyjaśnienie do swojej odpowiedzi. Zmiana czegokolwiek w tym wszystkim .htaccessnie ma wpływu composer, ponieważ nie jest to uruchamiane przez serwer WWW
Nico Haase
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.