Erreur de mise à jour de PHP Composer «impossible d'allouer de la mémoire» (avec Laravel 4)


169

Je ne peux tout simplement pas résoudre celui-ci.

Je suis sur le plan de base Linode 1G RAM. Essayer d'installer un package via Composer et ça ne me laisse pas. Ma limite de mémoire est définie sur "-1" sur PHP.ini

Puis-je faire autre chose pour l’installer?

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

Réponses:


97

Un peu vieux mais juste au cas où quelqu'un de nouveau chercherait une solution, la mise à jour de votre version PHP peut résoudre le problème.

Vous devez également valider votre fichier composer.lock et effectuer une installation de compositeur sur un environnement de production moins gourmand en ressources.

Plus de détails ici: https://github.com/composer/composer/issues/1898#issuecomment-23453850


12
BRILLANT! Ça a marché. Je n'ai pas mis à jour mon PHP, mais la validation du fichier composer.lock et la mise à jour ont tout installé correctement. Je vous remercie.
ericbae

6
En retard à la fête, mais j'ai simplement éteint Apache et MySQL. Il y a une raison pour laquelle j'utilise un VPS de 512 Mo de RAM, je ne veux pas dépenser d'argent.
Kumar

11
La mise à jour de PHP n'est pas une solution. J'ai 7.0.21 et j'obtiens toujours cette erreur.
cj5

La solution de @ Kumar a fonctionné pour moi. Super facile et comme la plupart des choses, évident avec le recul :)
James Bridgewater

Merci beaucoup. Cela m'a fait gagner du temps.
Jay Geeth

404

Il semble que vous manquez de mémoire d'échange, essayez ceci

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

comme mentionné par @ BlackBurn027 dans les commentaires ci-dessous, cette solution a été décrite ici


27
Vous, monsieur, êtes un génie - ce n'est pas un problème php et la suppression de fichiers ne vous aidera pas. Je dois suivre vos instructions (avec sudo) sur mon VPS. C'est la seule réponse utile ici pour les propriétaires de VPS.
Croll du

4
getcomposer.org/doc/articles/... comme mentionné par la source
BlackBurn027

1
Cela a fonctionné pour moi mais je ne sais pas ce que font réellement ces commandes, quelqu'un peut-il les expliquer?
Joseph Astrahan

2
parfois 1024 ne suffit pas ... Utilisez 2048 à la place
psylosss

1
@JaberAlNahian vous pouvez faire un échange permanent s'il vous plaît vérifier ici digitalocean.com/community/tutorials
Mohammed Omer

81

En tant que guide de dépannage du compositeur ici Cela peut se produire car le VPS manque de mémoire et n'a pas d'espace de swap activé.

free -m

Pour activer le swap, vous pouvez utiliser par exemple:

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

Ou si ci-dessus ne fonctionne pas, vous pouvez essayer de créer un fichier d'échange

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

merci beaucoup sans mettre à jour php5 vers php7 cela a fonctionné
Shadab K

Vous devez l'exécuter sur CLI de Linux
Umair Hamid

Cela a renvoyé l'erreur mais exécuter la mise à jour du compositeur après cela a bien fonctionné.
Amir Hajiha

Et vous pouvez consulter le [document officiel] [2] getcomposer.org/doc/articles/…
Thilina Dharmasena

38

J'ai été confronté au même problème. Je suis sur une micro-instance AWS Free qui a moins de mémoire. J'essaie toujours l'une des options ci-dessous et cela fonctionne toujours (avant tout cela, veuillez vérifier si la dernière version de composer est installée)

sudo php -dmemory_limit=750M composer.phar update

ou supprimez le contenu du dossier du fournisseur et essayez la mise à jour du compositeur.

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

La deuxième option essaie de mettre à jour tous les composants, s'il n'y a pas de mise à jour, elle récupère le package du cache, sinon le dist

Remarque: veuillez modifier la limite de mémoire selon votre choix.

ou

Créez une partition d'échange et essayez. La partition Swap est la partie du disque dur que Linux utilise comme mémoire virtuelle lorsqu'il manque de mémoire physique. C'est similaire au fichier d'échange Windows uniquement au lieu d'utiliser un fichier réel, Linux utilise une partition sur le disque dur à la place.

J'espère que cela t'aides


1
J'ai baissé la limite de mémoire à 500M et le compositeur a installé ce dont j'avais besoin.
devNoise

vous pouvez également utiliser un fichier d'échange réel au lieu d'une partition. voir cyberciti.biz/faq/linux-add-a-swap-file-howto
rwilson04

2
J'ai eu le même problème sur mon compte Digital Ocean même à 250M, j'ai également dû arrêter Apache et MySQL avant de pouvoir l'exécuter
tristanbailey

tristanbailey votre solution a fonctionné, merci! Avant d'arrêter mysql et apache, je ne pouvais pas mettre à jour, même en définissant la limite de mémoire php.
Elias Kouskoumvekakis

Quand je cours, sudo php -dmemory_limit=750M composer.phar update j'ai cette erreur Could not open input file: composer.phar, aidez
moi

15

Facile, tapez ces commandes:

rm -rf vendor/

rm -rf composer.lock

php composer install --prefer-dist

Devrait fonctionner pour les machines à faible mémoire


A travaillé pour moi. J'ai écrit une réponse complète ici - stackoverflow.com/questions/26850332/…
halkujabra

Ça ne fonctionne pas. Et cela a supprimé tout mon dossier de fournisseur. C'est faux!
Vladimir Kovalchuk

Quel est le problème de supprimer le fournisseur? il suffit d'exécuter à nouveau installer / mettre à jour ...
insigne

1
La suppression du fournisseur n'est pas totalement erronée, bien qu'elle casse le site et le maintient dans l'état cassé si l'installation ne fonctionne toujours pas. Cependant, la suppression du fichier de verrouillage sur les machines de production n'est pas conseillée. Vous devriez valider votre fichier de verrouillage et seulement installer, pas mettre à jour. En fait, en supprimant le fichier de verrouillage, vous obligez Composer à installer à partir du fichier json, d'où proviennent les processus gourmands en mémoire (déterminant la version de ce qu'il faut installer).
Shauna

Vous pouvez suivre ceci si vous n'êtes pas dans un environnement de production, car cela interrompra le projet jusqu'à ce que le compositeur ait terminé l'installation
Bizarro

11

Voici les étapes pour résoudre le problème: (méthode d'allocation de fichier SWAP rapide instantanée utilisée)

Configuration du serveur SWAP (Ubuntu 16.04 SWAP pour corriger les erreurs de mémoire insuffisante)

Vérifiez si vous disposez déjà du swap, de la mémoire et de la taille du disque:

    sudo swapon -s
    free -m
    df -h

Créer un fichier d'échange: (changez 1G en 4G si vous voulez 4 Go de mémoire SWAP)

    sudo fallocate -l 1G /swapfile 

Vérifiez le fichier d'échange:

    ls -lh /swapfile

Attribuer un fichier d'échange:

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

Vérifiez si le swap est OK, la mémoire et la taille du disque:

    sudo swapon -s
    free -m
    df -h

Joindre un fichier d'échange au redémarrage du système:

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

Ajuster les paramètres du fichier d'échange:

    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é du fichier SWAP: (0-100% => 0: ne pas échanger, 100: mettre SWAP et libérer la RAM)

        vm.swappiness=10

Supprimer l'inode du cache: (100: le système supprime les informations d'inode du cache trop rapidement)

        vm.vfs_cache_pressure = 50

Je ne sais pas ce que je dois faire à la dernière étape sudo nano /etc/sysctl.conf, donc, je l'ignore puis redémarre Nginx, puis fais composer install(auparavant, j'ai supprimé le répertoire du fournisseur) et cela fonctionne. Merci!
arhakim

10

J'ai eu le même problème sur vagabond. Je l'ai corrigé en allcate plus de mémoire.

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

1
Résolu ce problème pour moi aussi. Notez que dans vagrant 2.x au lieu de vb.customize ...vous pouvez le faire vb.memory = 1024.
acobster

10

Essayer

il augmente fondamentalement la mémoire d'échange

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
Veuillez ajouter quelques explications à votre réponse afin que d'autres puissent en tirer des leçons.
Nico Haase

Je suis d'accord pour dire que cela devrait avoir plus d'explications, mais cela a fonctionné pour moi (c'est essentiellement augmenter la mémoire d'échange). Merci!
user1015214

8

Essayez ça:

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

/sbin/mkswap /var/swap.1

/sbin/swapon /var/swap.1

1
Veuillez ajouter une explication à votre réponse afin que d'autres puissent en tirer des leçons - en particulier: qu'avez-vous changé par rapport aux autres réponses qui utilisent la même approche? Est-il nécessaire de dupliquer leur réponse?
Nico Haase le

7

Voici la solution de contournement que j'ai trouvée qui fonctionne pour moi à chaque fois:

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, poster les commandes sans expliquer ce qu'elles font est probablement dangereux! Bien que je puisse affirmer définitivement que cela fonctionnerait sur la plupart des systèmes. Fondamentalement, vous créez un espace de swap alloué afin que le HD puisse être utilisé comme RAM. Voici un guide complet sur la façon de faire cela expliquant chaque commande: digitalocean.com/community/tutorials
...

Merci pour la clarification des commandes, il est bon de savoir ce que fait réellement le script avant de l'exécuter. Mais de la même manière, la promotion de l'océan numérique et de votre tutoriel / article de blog n'est pas agréable.
Goran

Le tutoriel est génial, montrant étape par étape avec des explications!
Tarik

Je vous remercie! Vos instructions m'aident à installer Drupal Presto pour un serveur de 1 Go de RAM. J'ai changé 1024 en 2048.
Nikit

7

J'ai essayé en supprimant simplement le dossier du fournisseur et le fichier composer.lock , puis j'exécute la commande composer clear-cache, puis composer install. Donc, cela fonctionne sans aucune erreur.


6

vous pouvez utiliser ce qui suit pour vérifier votre mémoire libre (swap)

free -m

total used free shared buffers cached

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

Pour activer le swap, vous pouvez utiliser par exemple:

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

J'ai utilisé free -met j'ai remarqué que je n'avais pas de mémoire, même pas en échange ... puis sudo rebootça a marché
Eleazar Resendez

4

Cela semble être un problème récurrent avec les instances de serveur de 1 Go et plus petites. En plus d'essayer d'arrêter les processus et de modifier les paramètres de permutation, vous pouvez installer sur une machine locale et télécharger.


1
oui. Ce qui est drôle, c'est que si je supprime tout le projet, que je fais un nouveau git pull puis que je fais l'installation de composer, cela semble fonctionner. Étrange.
ericbae

Frustrant, je déploie quelques projets L4 sur des instances Linode de 1 Go et je crains maintenant d'atteindre le plafond de la mémoire.
Makita

Un ancien lien mais qui peut être d'une certaine utilité: github.com/composer/composer/issues/1104
Makita

2
La réponse acceptée reste la meilleure voie à suivre. Vous devez valider composer.lock, puis exécuter une installation au lieu d'une mise à jour sur le serveur de production.
Makita

3

Parfois, en mettant à jour automatiquement le compositeur, il résout le problème

php composer.phar self-update

À votre santé


Cela devrait être la première chose à essayer de résoudre le problème. J'ai eu un problème avec la 1.3.3, l'auto-mise à jour vers la 1.4.0 a résolu le problème. Astuce: vous pouvez mettre à jour votre réponse pour couvrir également le cas d'utilisation de composer self-update, si quelqu'un qui ne connaît pas vraiment le compositeur doit lire cette réponse.
Niklaus

obtenir la permission refusée lorsque le changement de nom se produit
Andrew

3

Essaye ça:

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

Ce travail pour moi sur Centos 6


cela a fonctionné pour moi sur AWS Opsworks EC2 Instance Ubuntu 14.04! Merci!
Paul Preibisch

3

J'ai augmenté le PHP memory_limitde 128M par défaut à 512M et redémarré le serveur. Cela a résolu le problème.


3
le redémarrage ne devrait pas être nécessaire car PHP ne fonctionne pas en tant que service.
HelpNeeder

1
Non mais Apache le fait et il devrait donc être redémarré pour prendre effet ...
Dédié le

1
il est nécessaire, car apache charge les modules php
Aris

2

Je me retrouve dans cette situation la plupart du temps, donc normalement je suivais l'étape de configuration de la mémoire d'échange.

Mais maintenant, j'ai trouvé une astuce alternative simple qui a fonctionné pour moi.

Exécuter composer update --no-devautre quecomposer update


2

J'ai résolu le même problème dans Vagrant. J'ai augmenté la valeur de memory_limit et supprimer le cache du compositeur: sudo rm -R ~ / .composer et enfin vagrant reload.


1

J'ai le même problème avec la mise à jour php composer.phar sur mon hébergement 512mb.

résolu avec l' installation de php composer.phar


1

Faites un échange et exécutez à nouveau la commande composer. J'espère que cela fonctionnera pour vous.

 $ 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

Dans mon cas, j'ai essayé tout ce qui était énuméré ci-dessus. J'utilisais Laravel et Vagrant avec 4 Go de mémoire et un swap, avec une limite de mémoire définie sur -1. J'ai supprimé le fournisseur / et essayé d'autres versions de PHP. Enfin, j'ai réussi à le faire fonctionner en exécutant

vagrant halt
vagrant up

Et puis l'installation du compositeur a fonctionné à nouveau comme d'habitude.


0

J'ai eu un problème similaire sur le serveur le moins cher (512 Mo de RAM) hébergé avec DigitalOcean , et j'utilisais également Jenkins CI sur le même serveur. Après avoir arrêté l'instance Jenkins, la commande d'installation du compositeur a fonctionné (enfin, jusqu'à un certain point, elle a échoué avec l'extension mcrypt manquante en plus d'être déjà installée!).

Peut-être que si vous avez une autre application en cours d'exécution sur le serveur, cela vaut peut-être la peine d'essayer de l'arrêter et de réexécuter la commande.


0

Veuillez désactiver le regroupement js et augmenter la mémoire. Cela devrait le réparer. J'ai corrigé le mien en désactivant le regroupement js.

Merci


Veuillez partager plus de détails sur votre réponse - pourquoi la désactivation de "js bundling" devrait-elle aider lorsqu'une erreur se produit lors du téléchargement d'un package (ce qui se produit bien avant l'exécution de tout script)
Nico Haase

-1

éditez le fichier php.ini et augmentez la valeur memory_limit.

memory_limit = 1G

résoudra ce problème.


-1
composer update

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

> mmap () a échoué: [12] Impossible d'allouer de la mémoire

Mettre à jour la mémoire sur le serveur et exiger «4G» Changer 4 Go de RAM [essayer de changer le type de serveur ou ajouter plus de RAM]

2 fichiers que nous devons éditer


sur commande

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

et modifier "memory_limit 756M”en4G


Php ini sur php 7.0

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

memory_limit = 128M à 4G

#AWS #AMAZONLINUX # MAGENTO2 # PHP7.0


1
Veuillez ajouter quelques explications à votre réponse. Changer quoi que ce soit dans .htaccessn'affecte pas composeraprès tout, car cela n'est pas exécuté via un serveur Web
Nico Haase
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.