Errore di aggiornamento PHP Composer “impossibile allocare memoria” (usando Laravel 4)


169

Non riesco proprio a risolvere questo.

Sono sul piano di base RAM Linode 1G. Cercare di installare un pacchetto tramite Composer e non mi sta permettendo. Il mio limite di memoria è impostato su "-1" su PHP.ini

C'è qualcos'altro che posso fare per installarlo?

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

Risposte:


97

Un po 'vecchio ma nel caso in cui qualcuno di nuovo stia cercando una soluzione, l'aggiornamento della versione di PHP può risolvere il problema.

Inoltre, dovresti eseguire il commit del tuo file composer.lock e fare l'installazione di un compositore in un ambiente di produzione che richiede meno risorse.

Maggiori dettagli qui: https://github.com/composer/composer/issues/1898#issuecomment-23453850


12
BRILLANTE! Ha funzionato Non ho aggiornato il mio PHP, ma il commit del file composer.lock e l'aggiornamento hanno installato tutto correttamente. Grazie.
ericbae,

6
In ritardo alla festa, ma ho semplicemente spento Apache e MySQL. C'è un motivo per cui sto usando un VPS RAM da 512 MB, non voglio spendere soldi.
Kumar,

11
L'aggiornamento di PHP non è una soluzione. Ho 7.0.21 e continuo a ricevere questo errore.
cj5,

@ La soluzione di Kumar ha funzionato per me. Super facile e come la maggior parte delle cose, ovvio col senno di poi :)
James Bridgewater

Molte grazie. Mi ha salvato un sacco di tempo.
Jay Geeth

404

Sembra che tu abbia esaurito la memoria di swap, prova questo

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

come menzionato da @ BlackBurn027 nei commenti seguenti, questa soluzione è stata descritta qui


27
Signore, siete un genio - non è un problema php e la rimozione dei file non sarà di aiuto. Devo seguire le tue istruzioni (con sudo) sul mio VPS. Questa è l'unica risposta utile qui per i proprietari di VPS.
Croll,

4
getcomposer.org/doc/articles/… come menzionato dalla fonte
BlackBurn027

1
Questo ha funzionato per me ma sono confuso su cosa stanno effettivamente facendo quei comandi, qualcuno può spiegarli?
Joseph Astrahan,

2
a volte 1024 non è abbastanza ... Usa invece il 2048
psyloss

1
@JaberAlNahian puoi effettuare uno scambio permanente, per favore controlla qui digitalocean.com/community/tutorials/…
Mohammed Omer

80

Come guida alla risoluzione dei problemi del compositore qui Ciò potrebbe accadere perché il VPS ha esaurito la memoria e non ha spazio di swap abilitato.

free -m

Per abilitare lo scambio è possibile utilizzare ad esempio:

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

O se sopra non ha funzionato, puoi provare a creare un file di scambio

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

grazie mille senza aggiornare php5 a php7 ha funzionato
Shadab K

Devi eseguirlo sulla CLI di Linux
Umair Hamid

Ha restituito l'errore ma l'esecuzione dell'aggiornamento del compositore ha funzionato correttamente.
Amir Hajiha,

E puoi controllare il [documento ufficiale] [2] getcomposer.org/doc/articles/…
Thilina Dharmasena il

38

Ho affrontato lo stesso problema. Sono su una AWS Free Microinstance che ha meno memoria. Provo sempre una delle opzioni seguenti e funziona sempre (prima di tutto, controlla se hai installato l'ultima versione di compositore)

sudo php -dmemory_limit=750M composer.phar update

o rimuovere il contenuto della cartella del fornitore e provare l'aggiornamento del compositore.

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

La seconda opzione tenta di aggiornare tutti i componenti, se non è presente alcun aggiornamento, preleva il pacchetto dalla cache altrimenti preleva dalla dist

Nota: modificare il limite di memoria secondo la propria scelta.

o

Crea una partizione di swap e prova. La partizione di swap è la parte del disco rigido che Linux utilizza come memoria virtuale quando esaurisce la memoria fisica. È simile al file di scambio di Windows invece di utilizzare un file reale, invece Linux utilizza una partizione sul disco rigido.

Spero che questo ti aiuti


1
Ho lasciato cadere il limite di memoria fino a 500M e il compositore ha installato ciò di cui avevo bisogno.
devNoise

puoi anche utilizzare un file di scambio effettivo anziché una partizione. vedi cyberciti.biz/faq/linux-add-a-swap-file-howto
rwilson04

2
Ho avuto lo stesso problema sul mio account Digital Ocean anche a 250M ho anche dovuto interrompere Apache e MySQL prima di poterlo eseguire
tristanbailey

tristanbailey la tua soluzione ha funzionato, grazie! Prima di interrompere mysql e apache non ho potuto aggiornare, anche impostando il limite di memoria php.
Elias Kouskoumvekakis,

Quando corro sudo php -dmemory_limit=750M composer.phar update ho ricevuto questo errore per Could not open input file: composer.pharfavore
aiutatemi

15

Facile, digita questi comandi:

rm -rf vendor/

rm -rf composer.lock

php composer install --prefer-dist

Dovrebbe funzionare per macchine con poca memoria


Ha funzionato per me. Ho scritto una risposta esauriente qui - stackoverflow.com/questions/26850332/...
halkujabra

La sua non funziona. E questo ha eliminato tutta la cartella del mio fornitore. È sbagliato!
Vladimir Kovalchuk,

Qual è il problema eliminare il fornitore? esegui di nuovo l'installazione / aggiornamento ...
firma il

1
L'eliminazione del fornitore non è del tutto errata, sebbene interrompa il sito e lo mantenga nello stato non funzionante se l'installazione continua a non funzionare. Tuttavia, non è consigliabile eliminare il file di blocco su macchine di produzione. Dovresti eseguire il commit del file di blocco e solo l'installazione, non l'aggiornamento. Infatti, eliminando il file di blocco, stai forzando l'installazione di Composer dal file json, che è da dove provengono i processi ad alta intensità di memoria (determinando quale versione di cosa installare).
Shauna,

Va bene seguirlo se non ci si trova in un ambiente di produzione, poiché interromperà il progetto fino a quando il compositore non avrà terminato l'installazione
Bizarro

11

Ecco i passaggi per risolvere il problema: (utilizzato il metodo di allocazione dei file SWAP veloce istantaneo)

Configurazione SWAP del server (Ubuntu 16.04 SWAP per la correzione degli errori di memoria insufficiente)

Controlla se hai già lo scambio, la memoria e le dimensioni del disco:

    sudo swapon -s
    free -m
    df -h

Crea file di scambio: (cambia 1G in 4G se vuoi una memoria SWAP da 4GB)

    sudo fallocate -l 1G /swapfile 

Controlla il file di scambio:

    ls -lh /swapfile

Assegna file di scambio:

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

Controlla se lo scambio è OK, la memoria e le dimensioni del disco:

    sudo swapon -s
    free -m
    df -h

Allega file di scambio al riavvio del sistema:

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

Modifica le impostazioni del file di scambio:

    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

Priorità file SWAP: (0-100% => 0: non inserire swap, 100: inserire SWAP e liberare la RAM)

        vm.swappiness=10

Rimuovi inode dalla cache: (100: il sistema rimuove le informazioni sull'inode dalla cache troppo rapidamente)

        vm.vfs_cache_pressure = 50

Non so cosa devo fare nell'ultimo passaggio sudo nano /etc/sysctl.conf, quindi lo salto, quindi riavvio Nginx e quindi composer install(in precedenza ho rimosso la directory del fornitore) e funziona. Grazie!
Arhakim,

10

Ho avuto lo stesso problema con Vagrant. L'ho risolto assegnando più memoria.

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

1
Risolto questo problema anche per me. Nota che in Vagrant 2.x invece di vb.customize ...te puoi farlo vb.memory = 1024.
aceto

10

Provare

fondamentalmente sta aumentando la memoria di scambio

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
Aggiungi una spiegazione alla tua risposta in modo che altri possano imparare da essa.
Nico Haase,

Concordo sul fatto che questo dovrebbe avere più spiegazioni, ma ha funzionato per me (in pratica sta aumentando la memoria di scambio). Grazie!
user1015214

8

Prova questo:

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

/sbin/mkswap /var/swap.1

/sbin/swapon /var/swap.1

1
Per favore aggiungi qualche spiegazione alla tua risposta in modo che altri possano imparare da essa - in particolare: cosa hai cambiato rispetto alle altre risposte che usano lo stesso approccio? C'è bisogno di duplicare la loro risposta?
Nico Haase,

7

Ecco la soluzione alternativa che ho trovato che funziona per me ogni volta:

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
Caspita, pubblicare i comandi senza spiegare cosa fanno è probabilmente pericoloso! Anche se posso affermare definitivamente che funzionerebbe sulla maggior parte dei sistemi. Fondamentalmente stai creando l'allocazione dello spazio di Swap in modo che l'HD possa essere usato come RAM. Ecco una guida completa su come farlo spiegando ogni comando: digitalocean.com/community/tutorials/…
adelriosantiago

Grazie per il chiarimento dei comandi, è bello sapere cosa fa effettivamente lo script prima di eseguirlo. Allo stesso modo, non è bello il modo in cui promuovi l'oceano digitale e il tuo post tutorial / blog.
Goran,

Il tutorial è fantastico, mostrando passo dopo passo con spiegazioni!
Tarik,

Grazie! Le tue istruzioni mi aiutano a installare Drupal Presto per un server RAM da 1 GB. Ho cambiato da 1024 a 2048.
Nikit

7

Ho provato semplicemente cancellando la cartella del fornitore e il file composer.lock e quindi eseguo il comando composer clear-cachee poi composer install. Quindi funziona senza errori.


6

è possibile utilizzare quanto segue per controllare la memoria libera (di swap)

free -m

total used free shared buffers cached

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

Per abilitare lo scambio è possibile utilizzare ad esempio:

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

Ho usato free -me notato che non avevo memoria, nemmeno in swap .. poi ha funzionato sudo reboote ha funzionato
Eleazar Resendez

4

Questo sembra essere un problema ricorrente con 1 GB e istanze del server più piccole. Oltre a tentare di arrestare i processi e modificare le impostazioni di scambio, è possibile installare su un computer locale e caricare.


1
Sì. La cosa divertente è che se elimino l'intero progetto, eseguo un nuovo pull git e quindi eseguo l'installazione del compositore, sembra funzionare. Strano.
Ericbae,

Frustrante, sto implementando alcuni progetti L4 in istanze Linode da 1 GB e ora sono preoccupato di colpire il limite di memoria.
Makita,

Un vecchio link ma potrebbe essere di qualche utilità: github.com/composer/composer/issues/1104
Makita

2
La risposta accettata è ancora il modo migliore di procedere. È necessario eseguire il commit di composer.lock e quindi eseguire un'installazione anziché un aggiornamento sul server di produzione.
Makita,

3

A volte, con l'auto-aggiornamento del compositore, si risolve il problema

php composer.phar self-update

Saluti


Questa dovrebbe essere la prima cosa da provare per risolvere il problema. Ho avuto un problema con 1.3.3, l'auto-aggiornamento alla 1.4.0 ha risolto il problema. Suggerimento: potresti aggiornare la tua risposta per coprire anche il caso d'uso di composer self-update, se qualcuno che non ha familiarità con il compositore deve leggere questa risposta.
Niklaus

ottenere l'autorizzazione negata quando si verifica la ridenominazione
Andrew

3

Prova questo:

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

Questo lavoro per me su Centos 6


questo ha funzionato per me su AWS Opsworks EC2 Instance Ubuntu 14.04! Grazie!
Paul Preibisch,

3

Ho aumentato il PHP memory_limitdai 128M a 512M predefiniti e riavviato il server. Ciò ha risolto il problema.


3
il riavvio non dovrebbe essere necessario in quanto PHP non funziona come servizio.
HelpNeeder,

1
No, ma Apache lo fa e quindi dovrebbe essere riavviato per avere effetto ...
Dediqated il

1
è necessario, poiché apache carica i moduli php
Aris il

2

Mi trovo in questa situazione la maggior parte delle volte, quindi normalmente seguivo il passaggio di impostazione della memoria di scambio.

Ma ora ho trovato un semplice trucco alternativo che ha funzionato per me.

Esegui composer update --no-devdiverso dacomposer update


2

Ho risolto lo stesso problema in Vagrant. Ho aumentato il valore di memory_limit e cancellato la cache del compositore: sudo rm -R ~ / .composer e infine la ricarica vagabonda.


1

ho lo stesso problema con l'aggiornamento php composer.phar sul mio hosting 512mb.

risolto con l' installazione di php composer.phar


1

Effettua uno scambio ed esegui di nuovo il comando compositore. Spero che funzionerà per te.

 $ 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

Nel mio caso ho provato tutto ciò che era elencato sopra. Stavo usando Laravel e Vagrant con 4 GB di memoria e uno scambio, con limite di memoria impostato su -1. Ho eliminato il venditore / e provato altre versioni di PHP. Alla fine, sono riuscito a funzionare eseguendo

vagrant halt
vagrant up

E poi l'installazione del compositore ha funzionato di nuovo come al solito.


0

Ho avuto un problema simile sul server più economico (512 MB di RAM) ospitato con DigitalOcean e stavo anche eseguendo Jenkins CI sullo stesso server. Dopo che ho fermato l'istanza di Jenkins, il comando di installazione del compositore ha funzionato (beh, fino a un certo punto, non è riuscito con l'estensione mcrypt mancante oltre a essere già installato!).

Forse se hai un'altra app in esecuzione sul server, forse vale la pena provare a fermarla e rieseguire il comando.


0

Si prega di disabilitare il bundle js e aumentare la memoria. Questo dovrebbe risolverlo. Ho risolto il mio disabilitando il raggruppamento js.

Grazie


Per favore condividi maggiori dettagli sulla tua risposta - perché disabilitare la funzione "js bundling" quando si verifica un errore durante il download di un pacchetto (cosa che accade molto prima che vengano eseguiti gli script)
Nico Haase

-1

modifica il file php.ini e aumenta il valore memory_limit.

memory_limit = 1G

risolverà questo problema.


-1
composer update

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

> mmap () non riuscito: [12] Impossibile allocare memoria

Aggiorna memoria sul server e richiede '4G' Cambia 4 GB di RAM [prova a cambiare il tipo di server o aggiungi più RAM]

2 file Abbiamo bisogno di modificare


a comando

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

e modifica "memory_limit 756M”in4G


Php ini su php 7.0

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

memory_limit = da 128M a 4G

#AWS #AMAZONLINUX # MAGENTO2 # PHP7.0


1
Aggiungi una spiegazione alla tua risposta. La modifica di qualsiasi .htaccesscosa non influisce composerdopo tutto, poiché non viene eseguita tramite un server web
Nico Haase,
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.