
Aujourd’hui une petite astuce que j’ai souvent eu l’habitude de résoudre sur des environnements de développement basé sur Vagrant Box en localhost, que ce soit dans le développement de projets Laravel ou Symfony moyens – gros.
L’article est aussi disponible en anglais sur mon blog Medium : How to fix Composer Memory Limit on Vagrant ?.
Table des matières
Allowed memory size : Impossible de lancer la commande « composer install » en local.
Lorsque vous voulez réaliser une commande via Composer, par exemple un « composer install« , vous pouvez lancer cette commande depuis un terminal de votre ordinateur ou de votre machine virtuelle Vagrant.
Dans le 1er cas, si vous lancez cette commande depuis un shell de votre ordinateur Windows, il se peut que que composer plante. En effet, Composer est dédié à un environnement Linux.
Vous décidez donc de passer par un terminal Git Bash, qui permet d’utiliser les commandes bash sous Windows, ou directement depuis la box Vagrant qui est, elle, sous Linux.
Cependant vous n’arrivez toujours pas à vos fins, et vous ne pouvez toujours pas lancer de quelconques commandes composer telles que :
composer install
composer require
composer update
PHP Fatal error: Allowed memory size of XXXXXX bytes exhausted.
C’est LE message sur composer que tout le monde redoute et qui mène clairement à une perte de plusieurs heures dans une journée de développement.
Il s’agit d’un problème d’utilisation de mémoire lié à composer et qui survient n’importe quand. En effet, vous pouvez très bien avoir un package.json de 5 ou 25 librairies, l’erreur se produit au hasard, en fonction de votre machine, des ressources allouées et de surtout de la mémoire que prend composer pour télécharger et installer les dépendances.
Vous pouvez aussi très bien rencontrer un « Allowed Memory Size » sur un simple « composer require », alors que la semaine d’avant tout votre environnement marchait nickel.
J’ai donc passé quelques temps à trouver des solutions, et je suis tombé, en fouillant sur Github, que je n’étais pas du tout le seul.
Résoudre l’erreur allowed memory size lors d’un composer install, require, update.
Si vous avez déjà passé de longues minutes à chercher une solution à ce problème, alors ce petit bout de code suivant est sans doute pour vous. Il s’agit de créer une partition de la RAM sur la machine virtuelle pour allouer de la mémoire supplémentaire. Cette technique est appelée “SWAP” :
Qu’est ce que le swap sur Linux ?
Swap est un espace sur un disque utilisé lorsque la quantité de mémoire RAM physique est pleine. Lorsqu’un système Linux manque de RAM, les pages inactives sont déplacées de la RAM vers l’espace de swap.
L’espace d’échange peut prendre la forme d’une partition d’échange dédiée ou d’un fichier d’échange.
Corriger le bug Allowed memory size de Composer
On y va ! Dans votre machine ou sur votre serveur tapez dans l’ordre ces commandes :
$ /bin/dd if=/dev/zero of=/var/swap.1 bs=4096k count=1024 |
$ chmod 600 /var/swap.1 |
$ /sbin/mkswap /var/swap.1 |
mkswap
$ /sbin/swapon /var/swap.1 |
swapon
$ COMPOSER_MEMORY_LIMIT=-1 composer require librairie/yours |
COMPOSER_MEMORY_LIMIT=-1
est optionnel, ensuite vous n’avez plus qu’à composer !Le problème se produit-il tout le temps avec Composer et Vagrant ?
Hé bien non pas forcément. L’erreur semble être spécifique à des versions de Composer < 2, car je n’ai pas eu le soucis sur de nouveaux environnements de développement utilisant Composer 2.
Néanmoins si vous rencontrez cette erreur aussi sur Composer 2, la solution reste toujours celle-ci, si vous ne souhaitez pas toucher à vos librairies du packages.json, en attendant une meilleure optimisation.
Cela dépend aussi de votre machine, car lorsque vous installez une machine virtuelle Homestead (ou Vagrant directement) vous avez possibilité d’allouer un nombre de mémoire maximum et un nombre de processeurs à utiliser.
Forcément, avec un ordinateur plus performant, votre machine virtuelle pourra aussi consommer plus de ressources, et donc le problème pourra être résolu.