Fehler beim PHP Composer-Update "Speicher kann nicht zugeordnet werden" (mit Laravel 4)

166

Ich kann dieses Problem einfach nicht lösen.

Ich bin auf Linode 1G RAM Grundplan. Der Versuch, ein Paket über Composer zu installieren, lässt mich nicht. Mein Speicherlimit ist auf PHP.ini auf "-1" gesetzt

Kann ich noch etwas tun, um dies zu installieren?

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
quelle

Antworten:

96

Ein bisschen alt, aber nur für den Fall, dass jemand Neues nach einer Lösung sucht, kann das Problem durch Aktualisieren Ihrer PHP-Version behoben werden.

Außerdem sollten Sie Ihre composer.lock-Datei festschreiben und eine Composer-Installation in einer weniger ressourcenintensiven Produktionsumgebung durchführen.

Weitere Details finden Sie hier: https://github.com/composer/composer/issues/1898#issuecomment-23453850

fl3x7
quelle
12
BRILLANT! Das hat funktioniert. Ich habe mein PHP nicht aktualisiert, aber die Datei composer.lock festgeschrieben und aktualisiert, hat alles richtig installiert. Danke dir.
Ericbae
6
Spät zur Party, aber ich habe einfach Apache und MySQL ausgeschaltet. Es gibt einen Grund, warum ich einen 512 MB RAM VPS verwende und kein Geld ausgeben möchte.
Kumar
11
Das Aktualisieren von PHP ist keine Lösung. Ich habe 7.0.21 und erhalte immer noch diesen Fehler.
cj5
@ Kumars Lösung hat bei mir funktioniert. Super einfach und wie die meisten Dinge, im Nachhinein offensichtlich :)
James Bridgewater
Vielen Dank. Hat mir viel Zeit gespart.
Jay Geeth
404

Sieht so aus, als ob Ihnen der Swap-Speicher ausgeht. Versuchen Sie dies

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

wie unten durch @ BlackBurn027 auf Kommentare erwähnt, wurde diese Lösung in beschrieben hier

Aditya Kresna Permana
quelle
27
Sie, Sir, sind ein Genie - es ist kein PHP-Problem und das Entfernen von Dateien hilft nichts. Ich muss Ihren Anweisungen (mit sudo) auf meinem VPS folgen. Dies ist die einzige nützliche Antwort für VPS-Besitzer.
Croll
4
getcomposer.org/doc/articles/… wie von der Quelle erwähnt
BlackBurn027
1
Das hat bei mir funktioniert, aber ich bin verwirrt, was diese Befehle tatsächlich tun. Kann jemand sie erklären?
Joseph Astrahan
2
manchmal ist 1024 nicht genug ... Verwenden Sie stattdessen 2048
Psylosss
1
@JaberAlNahian Sie können einen dauerhaften Tausch machen, bitte überprüfen Sie hier digitalocean.com/community/tutorials/…
Mohammed Omer
76

Als Anleitung zur Fehlerbehebung für Komponisten hier Dies kann passieren, weil der VPS nicht genügend Speicher hat und kein Swap-Speicherplatz aktiviert ist.

free -m

Um den Tausch zu aktivieren, können Sie beispielsweise Folgendes verwenden:

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

Oder wenn oben nicht funktioniert hat, können Sie versuchen, eine Auslagerungsdatei zu erstellen

sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
Umair Hamid
quelle
Vielen Dank, ohne PHP5 auf PHP7 zu aktualisieren. Dies hat funktioniert
Shadab K
Sie müssen es auf CLI von Linux ausführen
Umair Hamid
Es gab den Fehler erneut, aber das Ausführen des Composer-Updates danach funktionierte einwandfrei.
Amir Hajiha
Und Sie können das [offizielle Dokument] [2] getcomposer.org/doc/articles/…
Thilina Dharmasena
38

Ich habe das gleiche Problem konfrontiert. Ich bin auf einer AWS Free Microinstance, die weniger Speicher hat. Ich versuche immer eine der folgenden Optionen und es funktioniert immer (Vor allem überprüfen Sie bitte, ob Sie die neueste Version von Composer installiert haben).

sudo php -dmemory_limit=750M composer.phar update

oder entfernen Sie den Inhalt des Herstellerordners und versuchen Sie, den Composer zu aktualisieren.

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

Die zweite Option versucht, alle Komponenten zu aktualisieren. Wenn keine Aktualisierung erfolgt, wird das Paket aus dem Cache abgerufen, andernfalls wird es aus der Ferne abgerufen

Hinweis: Bitte ändern Sie das Speicherlimit nach Ihren Wünschen.

oder

Erstellen Sie eine Swap-Partition und versuchen Sie es. Die Swap-Partition ist der Teil der Festplatte, den Linux als virtuellen Speicher verwendet, wenn der physische Speicher knapp wird. Es ähnelt der Windows-Auslagerungsdatei nur, anstatt eine tatsächliche Datei zu verwenden. Linux verwendet stattdessen eine Partition auf der Festplatte.

Hoffe das hilft

Abishek
quelle
1
Ich habe das Speicherlimit auf 500 MB gesenkt und den Composer installiert, was ich brauchte.
DevNoise
Sie können auch eine tatsächliche Auslagerungsdatei anstelle einer Partition verwenden. siehe cyberciti.biz/faq/linux-add-a-swap-file-howto
rwilson04
2
Hatte das gleiche Problem auf meinem Digital Ocean-Konto sogar bei 250M Ich musste auch Apache und MySQL zuerst stoppen, bevor ich es ausführen konnte
Tristanbailey
tristanbailey deine lösung hat funktioniert, danke! Bevor ich MySQL und Apache stoppte, konnte ich nicht aktualisieren, selbst indem ich das PHP-Speicherlimit festlegte.
Elias Kouskoumvekakis
Wenn ich sudo php -dmemory_limit=750M composer.phar update Could not open input file: composer.phar
renne, habe
15

Geben Sie einfach die folgenden Befehle ein:

rm -rf vendor/

rm -rf composer.lock

php composer install --prefer-dist

Sollte für Maschinen mit wenig Speicher funktionieren

Insign
quelle
Hat für mich gearbeitet. Ich habe hier eine umfassende Antwort geschrieben - stackoverflow.com/questions/26850332/…
halkujabra
Es funktioniert nicht. Und dies löschte alle meine Lieferantenordner. Es ist falsch!
Vladimir Kovalchuk
Was ist das Problem, den Anbieter zu löschen? Führen Sie einfach die Installation / Aktualisierung erneut aus ...
Insign
1
Das Löschen des Anbieters ist nicht ganz falsch, obwohl es die Site beschädigt und sie im fehlerhaften Zustand hält, wenn die Installation immer noch nicht funktioniert. Das Löschen der Sperrdatei auf Produktionsmaschinen wird jedoch nicht empfohlen. Sie sollten Ihre Sperrdatei festschreiben und nur installieren, nicht aktualisieren. Wenn Sie die Sperrdatei löschen, erzwingen Sie Composer zur Installation aus der JSON-Datei, aus der die speicherintensiven Prozesse stammen (und bestimmen, welche Version von was installiert werden soll).
Shauna
Es ist in Ordnung, dies zu befolgen, wenn Sie sich nicht in einer Produktionsumgebung befinden, da das Projekt unterbrochen wird, bis der Komponist mit der Installation fertig ist
Bizarro
11

Hier sind die Schritte, um das Problem zu beheben: (Sofortige schnelle Zuweisungsmethode für SWAP-Dateien)

Server-SWAP-Setup (Ubuntu 16.04 SWAP zur Behebung von Speicherfehlern)

Überprüfen Sie, ob Sie bereits Swap, Speicher und Festplattengröße haben:

    sudo swapon -s
    free -m
    df -h

Auslagerungsdatei erstellen: (Ändern Sie 1G in 4G, wenn Sie 4 GB SWAP-Speicher benötigen.)

    sudo fallocate -l 1G /swapfile 

Swap-Datei überprüfen:

    ls -lh /swapfile

Swap-Datei zuweisen:

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

Überprüfen Sie, ob Swap OK, Speicher und Festplattengröße sind:

    sudo swapon -s
    free -m
    df -h

Anhängen der Auslagerungsdatei beim Neustart des Systems:

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

Passen Sie die Einstellungen für die Auslagerungsdatei an:

    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-Dateipriorität: (0-100% => 0: Nicht austauschen, 100: SWAP aktivieren und RAM freigeben)

        vm.swappiness=10

Inode aus dem Cache entfernen: (100: System entfernt Inode-Informationen zu schnell aus dem Cache)

        vm.vfs_cache_pressure = 50
Tarik
quelle
Ich weiß nicht, was ich im letzten Schritt tun sudo nano /etc/sysctl.confmuss. Also überspringe ich es, starte Nginx neu und mache es dann composer install(vorher habe ich das Herstellerverzeichnis entfernt) und es funktioniert. Vielen Dank!
Arhakim
10

Ich hatte das gleiche Problem mit Vagabunden. Ich habe es behoben, indem ich mehr Speicher zugewiesen habe.

 config.vm.provider :virtualbox do |vb|
      vb.customize ["modifyvm", :id, "--memory", "1024"]
 end
Yann 叶
quelle
1
Dieses Problem wurde auch für mich gelöst. Beachten Sie, dass in vagrant 2.x statt vb.customize ...Sie tun können vb.memory = 1024.
Acobster
10

Versuchen

Es erhöht im Grunde den Swap-Speicher

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
quelle
6
Bitte fügen Sie Ihrer Antwort eine Erklärung hinzu, damit andere daraus lernen können.
Nico Haase
Ich bin damit einverstanden, dass dies mehr Erklärung haben sollte, aber es hat bei mir funktioniert (es erhöht im Grunde das Swap-Gedächtnis). Vielen Dank!
user1015214
8

Versuch das:

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

/sbin/mkswap /var/swap.1

/sbin/swapon /var/swap.1
Ayo 'Lana
quelle
1
Bitte fügen Sie Ihrer Antwort eine Erklärung hinzu, damit andere daraus lernen können - insbesondere: Was haben Sie im Vergleich zu den anderen Antworten, die denselben Ansatz verwenden, geändert? Muss die Antwort dupliziert werden?
Nico Haase
7

Hier ist die Problemumgehung, die ich gefunden habe und die jedes Mal für mich funktioniert:

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
Goran
quelle
5
Wowwow, die Befehle zu veröffentlichen, ohne zu erklären, was sie tun, ist wahrscheinlich gefährlich! Obwohl ich definitiv sagen kann, dass es auf den meisten Systemen funktionieren würde. Grundsätzlich erstellen Sie einen zugewiesenen Swap-Speicherplatz, damit die Festplatte als RAM verwendet werden kann. Hier ist eine umfassende Anleitung, wie man das macht, die jeden Befehl erklärt: digitalocean.com/community/tutorials/…
adelriosantiago
Vielen Dank für die Klarstellung der Befehle. Es ist schön zu wissen, was das Skript tatsächlich tut, bevor Sie es ausführen. Aber auf die gleiche Weise ist es nicht schön, wie Sie für den digitalen Ozean und Ihren Tutorial- / Blog-Beitrag werben.
Goran
Das Tutorial ist großartig und zeigt Schritt für Schritt Erklärungen!
Tarik
Danke dir! Ihre Anweisungen helfen mir bei der Installation von Drupal Presto für 1 GB RAM-Server. Ich habe 1024 zu
2048 geändert.
7

Ich habe versucht, indem ich nur den Herstellerordner und die Datei composer.lock gelöscht habe und dann den Befehl ausgeführt habe composer clear-cacheund dann composer install. So funktioniert es ohne Fehler.

Manjunath A.
quelle
6

Sie können Folgendes verwenden, um Ihren freien (Swap-) Speicher zu überprüfen

free -m

total used free shared buffers cached

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

Um den Tausch zu aktivieren, können Sie beispielsweise Folgendes verwenden:

/bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024
/sbin/mkswap /var/swap.1
/sbin/swapon /var/swap.1
Rishi Ranjan
quelle
Ich benutzte free -mund bemerkte, dass ich kein Gedächtnis hatte, nicht einmal im Tausch. Dann tat es sudo rebootund es funktionierte
Eleazar Resendez
4

Dies scheint ein wiederkehrendes Problem bei 1 GB und kleineren Serverinstanzen zu sein. Abgesehen davon, dass Sie versuchen, Prozesse herunterzufahren und die Swap-Einstellungen zu optimieren, können Sie sie auf einem lokalen Computer installieren und hochladen.

Makita
quelle
1
ja. Lustige Sache ist, wenn ich das ganze Projekt lösche, einen neuen Git-Pull mache und dann die Composer-Installation mache, scheint es zu funktionieren. Seltsam.
Ericbae
Frustrierend ist, dass ich einige L4-Projekte für 1 GB Linode-Instanzen bereitstelle und mir jetzt Sorgen mache, die Speichergrenze zu erreichen.
Makita
Ein alter Link, der aber von Nutzen sein kann: github.com/composer/composer/issues/1104
Makita
2
Die akzeptierte Antwort ist immer noch der beste Weg. Sie sollten composer.lock festschreiben und dann eine Installation anstelle eines Updates auf dem Produktionsserver ausführen.
Makita
3

Manchmal löst es das Problem, indem es den Komponisten selbst aktualisiert

php composer.phar self-update

Prost

Titogelo
quelle
Dies sollte der erste Versuch sein, das Problem zu beheben. Ich hatte ein Problem mit 1.3.3. Die Selbstaktualisierung auf 1.4.0 hat das Problem behoben. Tipp: Sie können Ihre Antwort aktualisieren, um auch den Anwendungsfall abzudecken composer self-update, wenn jemand, der mit dem Komponisten nicht so vertraut ist, diese Antwort lesen soll.
Niklaus
Erlaubnis verweigert, wenn Umbenennung erfolgt
Andrew
3

Versuche dies:

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

Diese Arbeit für mich auf Centos 6

Adonias Vasquez
quelle
Dies funktionierte für mich auf AWS Opsworks EC2 Instance Ubuntu 14.04! Vielen Dank!
Paul Preibisch
3

Ich habe das PHP memory_limitvon 128M auf 512M erhöht und den Server neu gestartet. Das hat das Problem gelöst.

Aris
quelle
3
Ein Neustart sollte nicht erforderlich sein, da PHP nicht als Dienst ausgeführt wird.
HelpNeeder
1
Nein, aber Apache tut es und sollte daher neu gestartet werden, um wirksam zu werden ...
Dediqated
1
es wird benötigt, da Apache die PHP-Module lädt
Aris
2

Ich gerate die meiste Zeit in diese Situation, so dass ich normalerweise den Schritt des Einstellens des Auslagerungsspeichers befolgte.

Aber jetzt habe ich einen einfachen alternativen Trick gefunden, der für mich funktioniert hat.

Führen Sie composer update --no-devAndere alscomposer update

Bastin Robin
quelle
2

Ich habe das gleiche Problem in Vagrant gelöst. Ich habe den Wert von memory_limit erhöht und den Composer-Cache gelöscht: sudo rm -R ~ / .composer und schließlich vagrant reload .

Oussaka
quelle
1

habe das gleiche problem mit dem php composer.phar update auf meinem 512mb hosting.

gelöst mit php composer.phar installieren

Ivan Proskuryakov
quelle
1

Machen Sie einen Swap und führen Sie den Composer-Befehl erneut aus. Ich hoffe es wird für dich funktionieren.

 $ 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
quelle
1

In meinem Fall habe ich alles versucht, was oben aufgeführt war. Ich habe Laravel und Vagrant mit 4 GB Speicher und einem Swap verwendet, wobei das Speicherlimit auf -1 festgelegt war. Ich habe den Hersteller / gelöscht und andere PHP-Versionen ausprobiert. Schließlich habe ich es geschafft, durch Laufen zu funktionieren

vagrant halt
vagrant up

Und dann funktionierte die Composer-Installation wieder wie gewohnt.

PHZ.fi-Pharazon
quelle
0

Ich hatte ein ähnliches Problem auf dem billigsten Server (512 MB RAM) gehostet mit DigitalOcean , und ich war auch auf dem gleichen Server Jenkins CI ausgeführt wird . Nachdem ich die Jenkins-Instanz gestoppt hatte, funktionierte der Composer-Installationsbefehl (bis zu einem gewissen Punkt schlug er fehl, da die mcrypt-Erweiterung fehlte und bereits installiert war!).

Wenn auf dem Server eine andere App ausgeführt wird, lohnt es sich möglicherweise, sie zu stoppen und den Befehl erneut auszuführen.

Chris
quelle
0

Bitte deaktivieren Sie die js-Bündelung und erhöhen Sie den Speicher. Das sollte es beheben. Ich habe meine behoben, indem ich die js-Bündelung deaktiviert habe.

Vielen Dank

Mani Mann
quelle
Bitte teilen Sie weitere Details zu Ihrer Antwort mit - warum sollte das Deaktivieren der "js-Bündelung" helfen, wenn beim Herunterladen eines Pakets ein Fehler auftritt (was lange vor dem Ausführen von Skripten geschieht)
Nico Haase,
-1

Bearbeiten Sie die Datei php.ini und erhöhen Sie den Wert für memory_limit.

memory_limit = 1G

wird dieses Problem lösen.

Amjith
quelle
-1
composer update

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

> mmap () fehlgeschlagen: [12] Speicher kann nicht zugeordnet werden

Aktualisieren Sie den Speicher auf dem Server und benötigen Sie '4G'. Ändern Sie den 4-GB-RAM [versuchen Sie, den Servertyp zu ändern oder weiteren RAM hinzuzufügen]

2 Dateien Wir müssen bearbeiten


auf Befehl

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

und bearbeiten "memory_limit 756M”zu4G


Php ini auf php 7.0

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

memory_limit = 128M bis 4G

#AWS #AMAZONLINUX # MAGENTO2 # PHP7.0

SUNNETmedia
quelle
1
Bitte fügen Sie Ihrer Antwort eine Erklärung hinzu. Das Ändern von Änderungen .htaccesswirkt sich schließlich nicht composeraus, da dies nicht über einen Webserver ausgeführt wird
Nico Haase,