Limite di memoria per l'aggiornamento del compositore


96

Devo eseguire l'aggiornamento del compositore sul mio hosting, quindi accedo con ssh e provo a eseguire il comando:

composer update

dentro la cartella / www dove ho Laravel e l'installazione del compositore

ma ottengo un errore:

inserisci qui la descrizione dell'immagine

in contatto con il mio provider di hosting mi dicono di eseguire il comando:

php -d memory_limit=512M composer update

Eseguo questo comando ma ottengo: "Impossibile aprire il file: compositore"

Cosa fare? Qual è la soluzione qui?


2
Come ha detto @Sven, in produzione composer installè sufficiente. Nel tuo caso, mentre utilizzi un hosting condiviso, penso che non composer updatefunzionerai, quindi l'unico modo è acquistare un hosting VPS come Digital Ocean, Linode.
Lucas Silva

Risposte:


144

Quando si esegue composer update, il sistema operativo esaminerà i percorsi configurati e tenterà di individuare un file eseguibile con quel nome.

Durante l'esecuzione php composer update, la composerstringa viene trattata come un parametro di PHP, che non viene cercato in alcun percorso. Devi fornire il percorso completo per eseguirlo.

L'esecuzione which composerti dirà dove il sistema operativo trova l'eseguibile del compositore, quindi utilizzerai semplicemente il percorso completo nel comando PHP:

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

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

Tieni presente che 512 MB potrebbero essere troppo pochi. La mia percezione è che ci vorrà felicemente 1 GB o più, a seconda del numero di dipendenze che usi e della varietà di versioni che teoricamente permetti, cioè se permetti Symfony ~2.3, allora fai in modo che Composer si occupi di molte più versioni possibili rispetto all'uso ~2.7.

Si noti inoltre che eseguire Composer sulla macchina di produzione non è l'idea migliore. Dovresti avere accesso a GitHub, forse fornire le credenziali di accesso, avere gli strumenti VCS installati e interromperai facilmente il tuo sito se uno qualsiasi dei server di hosting remoto è offline durante l'aggiornamento. È un'idea migliore utilizzare Composer su un sistema di distribuzione che esegue tutta la preparazione e quindi sposta tutti i file sul server di produzione.

Aggiornare

È l'anno 2020 ora e il modo in cui Composer gestisce la sua memoria è cambiato parecchio. La cosa più importante è che Composer aumenterà il limite di memoria da solo se incontra un limite impostato troppo basso. Questo però fa scattare immediatamente il problema dell'esaurimento della memoria su macchine che hanno troppa poca memoria installata. Puoi fare in modo che Composer utilizzi meno memoria impostando la variabile d'ambiente come COMPOSER_MEMORY_LIMIT=512M, ma questo creerà problemi se Composer avesse bisogno di più memoria per funzionare correttamente.

Il mio punto principale rimane vero: non eseguire Composer su macchine con poca memoria installata. Potenzialmente hai bisogno di 1,5 GB di memoria libera per poter aggiornare tutto.


Ho appena scritto: php -r "readfile (' getcomposer.org/installer' );" | php e dopo tutto funziona bene ... anche THANS FOR HELP
Andrew

41
php -d memory_limit=-1 $(which composer) updateè più conveniente perché non è necessario specificare il percorso del compositore.
Rax

1
Questo è fantastico. Non sapevo che potessi aumentare la memoria per un singolo comando. Questo è ciò che sta facendo bene?
plushyObject

come in Windows?
Ray

1
@Rax ancora una cosa, se stai eseguendo questo comando in Windows su mingw, riceverai un errore che il percorso deve essere tradotto quindi usa questo comandophp -d memory_limit=-1 $(which composer).phar update
Faizan

155

Impostalo per utilizzare tutta la memoria che vuole con:

COMPOSER_MEMORY_LIMIT=-1 composer update

Come possiamo impostare questo valore o qualsiasi valore a livello globale? invece di doverlo fare ogni volta tramite CLI?
snh_nl

@snh_nl dovrai impostare il limite di memoria php. Esempio: chapterthree.com/blog/how-fix-composer-memory-issue
jasonflaherty

2
Definiscilo globalmente nel tuo / etc / profile (o qualsiasi altra shell usi) con COMPOSER_MEMORY_LIMIT=-1; export COMPOSER_MEMORY_LIMIT. O definirlo un alias di shell? alias memcomposer='COMPOSER_MEMORY_LIMIT=-1 composer', quindi usa al memcomposerposto dicomposer
diamondsea

Si dice ancoraFatal 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

Sto affrontando problemi con il compositore perché consuma tutta la memoria disponibile, quindi il processo viene interrotto (in realtà, il messaggio di output è "Killed")

Quindi, stavo cercando una soluzione per limitare l'utilizzo della memoria del compositore.

Ho provato (dalle risposte di @Sven)

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

Ma non ha funzionato perché

"Composer aumenta internamente il memory_limit a 1.5G."

-> Quello è dal sito ufficiale del compositore.

Poi ho trovato un comando che funziona:

$ COMPOSER_MEMORY_LIMIT=512M php composer.phar update

Anche se nel mio caso 512 MB non sono sufficienti!

Fonte: https://www.agileana.com/blog/composer-memory-limit-troubleshooting/


1
Ho dovuto usare il compositore in questo modo: COMPOSER_MEMORY_LIMIT = 1024M compositore richiedono 'modulo'
jasonflaherty

1
Simile, ho usatoCOMPOSER_MEMORY_LIMIT=-1 composer require <package name>
realtebo

13

Ho dovuto combinare COMPOSER_MEMORY_LIMITe memory_limitnella riga di comando:

Su Windows:

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

Su Linux:

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

Questo è l'unico che ha funzionato per me su Mac OS X El Capitan.
ymd_

12

La soluzione migliore per me è

COMPOSER_MEMORY_LIMIT=-1 composer require <package-name>

menzionato da @realtebo


8

Se c'è abbastanza memoria, il compositore la consumerebbe internamente e funzionerebbe senza problemi. Non c'è bisogno di dire specificamente al compositore di farlo.

Hai provato ad aumentare la tua memoria di scambio, perché ha funzionato per me. Ho aumentato la memoria di scambio a 4096 Mb (4 GB) e ora mi sembra tutto fantastico.

utilizzare prima " sudo free" per vedere la memoria disponibile e la memoria di scambio. e configura swap come,

Per 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

per renderlo permanente aggiungilo al file / etc / fstab, /swapfile swap swap defaults 0 0

Per 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

è possibile aumentare la memoria di scambio modificando bs = 1024k o 2048k o 8096k a seconda della dimensione del volume fisico. usa i comandi 'swapon' e swapoff per vedere la differenza.

controlla 'swappiness' (60 dovrebbe andare bene,)

cat /proc/sys/vm/swappiness

5

Puoi modificare il memory_limitvalore nel tuo php.ini

Prova ad aumentare il limite nel tuo file php.ini

Usa -1 per illimitato o definisci un valore esplicito come 2G

memory_limit = -1

Nota: Composer aumenta internamente il memory_limit a 1.5G.

Leggi la documentazione getcomposer.org


3

Su MAC OS High Siera ho eseguito quanto segue:

MacBook-Pro:asiu jack$ php --ini

Restituito:

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

Tutte le risposte precedenti stanno impostando la configurazione caricata che si aggiorna, ma si noti che i file .ini aggiuntivi analizzati hanno php-memory-limits.ini come file separato. Devi aggiornare anche questo limite di memoria di file. allo stesso modo apri nell'editor di testo e cambia in qualcosa come 2G. L'output in caso di errore del limite di memoria dovrebbe dirti quanta memoria deve essere eseguita, basta impostarlo su un valore superiore a quello o -1 per illimitato.


2

Questo errore può verificarsi soprattutto quando si aggiornano librerie di grandi dimensioni o librerie con molte dipendenze. Il compositore può essere piuttosto affamato di memoria.

Assicurati che il tuo compositore stesso sia aggiornato all'ultima versione:

php composer.phar --self-update

Puoi aumentare temporaneamente il limite di memoria per il compositore aggiungendo la variabile d'ambiente del limite di memoria del compositore:

COMPOSER_MEMORY_LIMIT=128MB php composer.phar update

Utilizzare il formato "128 M" per megabyte o "2G" per gigabyte. È possibile utilizzare il valore "-1" per ignorare completamente il limite di memoria.

Un altro modo sarebbe aumentare il limite di memoria PHP:

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

2

L'ho fatto su Windows 10 e ho lavorato con me:

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

Puoi modificare il valore xx che desideri

 memory_limit=XX

1

Quanto è grande il tuo server aws? Se ha solo 1 GB di RAM, l'impostazione del limite di memoria di 2 GB in php.ini non aiuterà.

Se non puoi / non vuoi aumentare anche il lato server per avere più RAM disponibile, puoi abilitare anche SWAP.

Vedi qui per come abilitare lo scambio. Abilita 4 GB, anche se in genere faccio solo 1 GB da solo.

Fonte: tratto dal sito laracast


0

Nel mio caso nessuna delle risposte ha aiutato. Alla fine si è scoperto che il passaggio a una versione a 64 bit di PHP (M $ Windows) ha risolto immediatamente il problema. Non ho modificato le impostazioni: ha funzionato.


0

Sto eseguendo Laravel 6 con Homestead e ho riscontrato anche questo problema. Come suggerito qui nelle altre risposte, puoi aggiungere COMPOSER_MEMORY_LIMIT=-1un prefisso a un singolo comando ed eseguire il comando normalmente. Se desideri aggiornare la tua configurazione PHP per consentire sempre una memoria illimitata, segui questi passaggi.

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

Aggiungi memory_limit=-1al tuo file php.ini. Se hai problemi a usare Vim o ad apportare modifiche al file php.ini, controlla questa risposta su come modificare il file php.ini con Vim. Il file dovrebbe essere simile a questo:

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

Nota che questo potrebbe consumare una quantità infinita di memoria sulla tua macchina. Probabilmente non è una buona idea per la produzione lol. Con Laravel Valet ho dovuto seguire questo articolo e aggiornare il valore della memoria qui:

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

Quindi riavvia il server con Valet:

valet restart

Questa risposta è stata utile anche per modificare la configurazione con Laravel Valet su Mac in modo che le modifiche abbiano effetto.


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

3
Per favore aggiungi qualche spiegazione alla tua risposta in modo che altri possano imparare da essa
Nico Haase



0

Per Laravel

Passaggio 1. Apri il tuo terminale

passaggio 2. cdnella directory laravel

passaggio 3. Digita il comando which composer, nella tua directory laravel e prendi nota della directory in cui risiede composer.

passaggio 4. esegui il comando php -d memory_limit=-1 /opt/cpanel/bin/composer update(puoi anche eseguire il codice se funziona per te)

(modificare /opt/cpanel/bin/composer al percorso della directory restituito al passaggio 3)

Problema risolto


0

In Windows 10 (Git bash), ho dovuto usarlo

php -d memory_limit=-1 C:\\composer\\composer.phar install

-1

Nel mio caso erano necessarie autorizzazioni più elevate insieme a questo aumento del limite di memoria.

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

Eseguire Composer con sudonon è una buona idea, poiché confonderebbe le tue autorizzazioni. Sembra che tu stia girando composer updatesu un server - anche questa è una cattiva pratica, poiché renderà molto più diverso mettere le dipendenze calcolate sotto il controllo della versione
Nico Haase

D'accordo con @NicoHaase, devi stare molto attento a usarlo! Grazie.
Naser Nikzad
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.