Limit pamięci aktualizacji kompozytora


86

Muszę uruchomić aktualizację kompozytora na moim hostingu, więc loguję się przez ssh i próbuję uruchomić comand:

composer update

wewnątrz folderu / www, w którym mam instalacje laravel i composer

ale pojawia się błąd: wprowadź opis obrazu tutaj

w kontakcie z moim dostawcą hostingu każą mi uruchomić polecenie:

php -d memory_limit=512M composer update

Uruchamiam to polecenie, ale otrzymuję komunikat: „Could not open file: composer”

Co robić? Jakie jest tutaj rozwiązanie?


2
Jak powiedział @Sven, w produkcji composer installwystarczy. W twoim przypadku, korzystając z hostingu współdzielonego, myślę, że nie będziesz composer updatedziałać, więc jedynym sposobem jest zakup hostingu VPS, takiego jak Digital Ocean, Linode.
Lucas Silva

Odpowiedzi:


133

Po uruchomieniu composer updatesystem operacyjny zajrzy do skonfigurowanych ścieżek i spróbuje zlokalizować plik wykonywalny o tej nazwie.

Uruchamiając php composer updateThe composerciąg jest traktowana jako parametr do PHP, które nie są wyszukiwane w żadnej ścieżki. Aby go uruchomić, musisz podać pełną ścieżkę.

Uruchomienie which composerpowie ci, gdzie system operacyjny znajduje plik wykonywalny kompozytora, a następnie po prostu użyj pełnej ścieżki w poleceniu PHP:

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

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

Pamiętaj, że 512 MB może być za mało. Uważam, że szczęśliwie zajmie 1 GB lub więcej, w zależności od liczby zależności, których używasz i różnorodności wersji, na które teoretycznie zezwalasz, tj. Jeśli pozwolisz Symfony ~2.3, wtedy Composer poradzi sobie z dużo większą liczbą możliwych wersji w porównaniu do używania ~2.7.

Pamiętaj również, że uruchomienie Composera na maszynie produkcyjnej nie jest najlepszym pomysłem. Musisz mieć dostęp do Github, być może podać dane dostępu, mieć zainstalowane narzędzia VCS i łatwo zepsujesz swoją witrynę, jeśli którykolwiek ze zdalnych serwerów hostingowych jest offline podczas aktualizacji. Lepszym pomysłem jest użycie Composera w systemie wdrożeniowym, który wykonuje wszystkie przygotowania, a następnie przenosi wszystkie pliki na serwer produkcyjny.

Aktualizacja

Teraz jest rok 2020, a sposób, w jaki Composer zarządza swoją pamięcią, nieco się zmienił. Najważniejsze jest to, że Composer sam zwiększy limit pamięci, jeśli napotka limit ustawiony zbyt nisko. To jednak natychmiast powoduje problem braku pamięci na maszynach, które mają za mało zainstalowanej pamięci. Możesz sprawić, by Composer zużywał mniej pamięci, ustawiając zmienną środowiskową, taką jak COMPOSER_MEMORY_LIMIT=512M, ale spowoduje to problemy, jeśli Composer będzie potrzebował więcej pamięci do prawidłowego działania.

Mój główny punkt pozostaje prawdziwy: nie uruchamiaj Composera na maszynach, które mają za mało zainstalowanej pamięci. Potencjalnie potrzebujesz 1,5 GB wolnej pamięci, aby móc zaktualizować wszystko.


Po prostu napisałem: php -r "readfile (' getcomposer.org/installer' );" | php, a potem wszystko działa dobrze ... także NIŻ POMOC
Andrew

35
php -d memory_limit=-1 $(which composer) updatejest wygodniejszy, ponieważ nie ma potrzeby określania ścieżki kompozytora.
Rax

1
To jest świetne. Nie wiedziałem, że możesz zwiększyć pamięć dla jednej komendy. To właśnie robi, prawda?
plushyObject

jak w oknach?
Ray

1
@Rax jeszcze jedno, jeśli uruchamiasz to polecenie w oknach na mingw, otrzymasz błąd, że ścieżka musi zostać przetłumaczona, więc użyj tego poleceniaphp -d memory_limit=-1 $(which composer).phar update
Faizan

142

Ustaw, aby używał tyle pamięci, ile chce:

COMPOSER_MEMORY_LIMIT=-1 composer update

Jak możemy ustawić tę wartość lub dowolną wartość globalnie? zamiast robić to za każdym razem przez CLI?
snh_nl

@snh_nl będziesz musiał ustawić limit pamięci php. Przykład: Chapterthree.com/blog/how-fix-composer-memory-issue
jasonflaherty

2
Zdefiniuj to globalnie w swoim / etc / profile (lub jakiejkolwiek powłoce, której używasz) COMPOSER_MEMORY_LIMIT=-1; export COMPOSER_MEMORY_LIMIT. Albo zdefiniować go jako alias powłoki? alias memcomposer='COMPOSER_MEMORY_LIMIT=-1 composer', a następnie użyj memcomposerzamiastcomposer
diamondsea

Nadal jest napisaneFatal 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
Ozan Kurt

15

Mam problemy z narzędziem Composer, ponieważ zajmuje on całą dostępną pamięć, a następnie proces zostaje zabity (w rzeczywistości komunikat wyjściowy to „Killed”)

Szukałem więc rozwiązania, które ograniczy użycie pamięci kompozytora.

Próbowałem (z odpowiedzi @Sven)

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

Ale to nie zadziałało, ponieważ

„Composer wewnętrznie zwiększa memory_limit do 1,5G”.

-> To z oficjalnej strony kompozytora.

Wtedy znalazłem polecenie, które działa:

$ COMPOSER_MEMORY_LIMIT=512M php composer.phar update

Jednak w moim przypadku 512MB to za mało!

Źródło: https://www.agileana.com/blog/composer-memory-limit-troubleshooting/


1
Musiałem użyć kompozytora w ten sposób: COMPOSER_MEMORY_LIMIT = 1024M kompozytor wymaga `` modułu ''
jasonflaherty

1
Podobnie użyłemCOMPOSER_MEMORY_LIMIT=-1 composer require <package name>
realtebo

12

Musiałem połączyć COMPOSER_MEMORY_LIMITiw memory_limitlinii poleceń:

W systemie Windows:

set COMPOSER_MEMORY_LIMIT=99999999999&& php -d memory_limit=-1 composer.phar update

W systemie Linux:

export COMPOSER_MEMORY_LIMIT=99999999999 && php -d memory_limit=-1 composer.phar update

To jedyny, który działał dla mnie w systemie Mac OS X El Capitan.
ymd_

Pracował dla mnie, dzięki
Sayydika

8

Jeśli jest wystarczająco dużo pamięci, kompozytor wykorzystałby ją wewnętrznie i uruchomiłby bez problemu. Nie trzeba specjalnie mówić kompozytorowi, żeby to zrobił.

Czy próbowałeś zwiększyć swoją pamięć wymiany, bo to zadziałało dla mnie. Zwiększyłem pamięć wymiany do 4096Mb (4GB) i teraz wszystko wygląda świetnie.

najpierw użyj „ sudo free”, aby zobaczyć dostępną pamięć i wymienić pamięć. i skonfiguruj swap jako,

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

aby było na stałe, dodaj to do pliku / etc / fstab, /swapfile swap swap defaults 0 0

Dla 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

możesz zwiększyć swoją pamięć wymiany, zmieniając bs = 1024k lub 2048k lub 8096k w zależności od rozmiaru fizycznego woluminu. użyj poleceń „swapon” i swapoff, aby zobaczyć różnicę.

zaznacz 'swappiness' (60 powinno wystarczyć)

cat /proc/sys/vm/swappiness

4

Możesz zmienić memory_limitwartość w swoim php.ini

Spróbuj zwiększyć limit w pliku php.ini

Użyj -1 dla nieograniczonej liczby lub zdefiniuj jawną wartość, taką jak 2G

memory_limit = -1

Uwaga: Composer wewnętrznie zwiększa memory_limit do 1,5G.

Przeczytaj dokumentację getcomposer.org


3

Na MAC OS High Siera uruchomiłem poniższe:

MacBook-Pro:asiu jack$ php --ini

Zwrócony:

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

Wszystkie powyższe odpowiedzi ustawiają załadowaną konfigurację, która się aktualizuje, ale zauważ, że dodatkowe przeanalizowane pliki .ini mają php-memory-limits.ini jako oddzielny plik. Musisz również zaktualizować limit pamięci plików. w ten sam sposób otwórz w edytorze tekstu i zmień na coś takiego jak 2G. Wynik błędu limitu pamięci powinien powiedzieć, ile pamięci potrzebuje do uruchomienia, po prostu ustaw go na wyższą lub -1 dla nieograniczonej.


2

Ten błąd może wystąpić zwłaszcza podczas aktualizowania dużych bibliotek lub bibliotek z wieloma zależnościami. Kompozytor może być bardzo głodny pamięci.

Upewnij się, że sam kompozytor został zaktualizowany do najnowszej wersji:

php composer.phar --self-update

Możesz tymczasowo zwiększyć limit pamięci dla kompozytora, dodając zmienną środowiskową limit pamięci kompozytora:

COMPOSER_MEMORY_LIMIT=128MB php composer.phar update

Użyj formatu „128M” dla megabajtów lub „2G” dla gigabajtów. Możesz użyć wartości „-1”, aby całkowicie zignorować limit pamięci.

Innym sposobem byłoby zwiększenie limitu pamięci PHP:

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

2

Dla mnie najlepszym rozwiązaniem jest

COMPOSER_MEMORY_LIMIT=-1 composer require <package-name>

wspomniane przez @realtebo


1

Jak duży jest Twój serwer AWS? Jeśli ma tylko 1 GB pamięci RAM, ustawienie limitu pamięci na 2 GB w php.ini nie pomoże.

Jeśli nie możesz / nie chcesz również zwiększać strony serwera, aby uzyskać więcej dostępnej pamięci RAM, możesz również włączyć SWAP.

Zobacz tutaj, jak włączyć zamianę. Umożliwia 4 GB, chociaż zazwyczaj sam robię tylko 1 GB.

Źródło: pochodzi z witryny Laracast


0

W moim przypadku żadna z odpowiedzi nie pomogła. W końcu okazało się, że przejście na 64-bitową wersję PHP (M $ Windows) natychmiast rozwiązało problem. Nie zmieniałem żadnych ustawień - po prostu działało.


0

Zrobiłem to na Widnows 10 i pracowałem ze mną:

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

Możesz zmienić wartość xx , którą chcesz

 memory_limit=XX

0

Używam Laravel 6 z Homestead i też napotkałem ten problem. Jak sugerowano tutaj w innych odpowiedziach, możesz poprzedzić COMPOSER_MEMORY_LIMIT=-1pojedynczą komendę i uruchomić ją normalnie. Jeśli chcesz zaktualizować konfigurację PHP, aby zawsze zezwalać na nieograniczoną ilość pamięci, wykonaj następujące kroki.

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

Dodaj memory_limit=-1do swojego pliku php.ini. Jeśli masz problemy z używaniem Vima lub edycją pliku php.ini, sprawdź tę odpowiedź o tym, jak edytować plik php.ini za pomocą Vima. Plik powinien wyglądać mniej więcej tak:

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

Zauważ, że może to pochłonąć nieskończoną ilość pamięci na twoim komputerze. Prawdopodobnie nie jest to dobry pomysł na produkcję lol. W przypadku Laravel Valet musiałem postępować zgodnie z tym artykułem i zaktualizować wartość pamięci tutaj:

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

Następnie zrestartuj serwer za pomocą Valet:

valet restart

Ta odpowiedź była również pomocna przy zmianie konfiguracji z Laravel Valet na Macu, aby zmiany odniosły skutek.


0
<C:\>set COMPOSER_MEMORY_LIMIT=-1
<C:\>composer install exhausted/packages

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



0

Dla Laravel

Krok 1. Otwórz terminal

krok 2. cddo katalogu laravel

krok 3. Wpisz polecenie which composerw katalogu laravel i zanotuj katalog, w którym znajduje się kompozytor.

krok 4. uruchom polecenie php -d memory_limit=-1 /opt/cpanel/bin/composer update(możesz również uruchomić kod, jeśli działa dla Ciebie)

(zmień /opt/cpanel/bin/composerna ścieżkę katalogu zwróconą w kroku 3)

Problem rozwiązany


-1

W moim przypadku potrzebował wyższych uprawnień wraz ze zwiększeniem limitu pamięci.

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

Uruchamianie Composera z sudonie jest dobrym pomysłem, ponieważ spowoduje to pomieszanie uprawnień. Wygląda na to, że pracujesz composer updatena serwerze - jest to również zła praktyka, ponieważ znacznie bardziej różni się umieszczanie obliczonych zależności pod kontrolą wersji
Nico Haase

Zgadzam się z @NicoHaase, używając tego musisz być bardzo ostrożny! dzięki.
Naser Nikzad
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.