Résoudre l’erreur : Allowed memory size of bytes exhausted

Si vous êtes un développeur qui utilise le langage de programmation PHP, vous avez forcément déjà eu cette erreur qui est un grand classique. Cette erreur Allowed memory size of * bytes exhausted (tried to allocate * bytes) c’est un peu un passage obligé et le mieux c’est qu’elle arrive pendant la phase de conception et développement de votre script ou application en PHP. Sur un serveur de production, c’est un peu plus grave et les ennuis peuvent vite s’accumuler.

En général, il s’agit de code et donc d’un programme qui est mal pensé et qu’il faut optimiser. Cependant, ce n’est pas toujours le cas et parfois, vous manquez juste de mémoire sur la machine qui exécute votre code PHP. D’ailleurs, pendant que j’y pense, n’oubliez pas d’installer les mises à jour de PHP, car les performances et l’optimisation apporté par les mainteneurs est vraiment très bonne sur les dernières versions de PHP. Tout ça avec bien évidemment des nouvelles fonctionnalités très intéressantes implémentées nativement dans le langage PHP pour améliorer son propre code. Pour faire le ménage sur votre serveur web, vous pouvez aussi facilement supprimer les anciennes versions de PHP sur Ubuntu.

C’est quoi cette erreur Allowed memory size of bytes exhausted tried to allocate bytes

Pour faire simple et sur le principe ça l’est, cette erreur « Allowed memory size of 134217728 bytes exhausted (tried to allocate 1052672 bytes) » indique que votre script PHP a dépassé la limite de mémoire allouée pour son exécution. Rassurez-vous si ce n’est pas votre script qui a un problème de conception et qui consomme trop de mémoire inutilement, c’est juste qu’il se sent un peu à l’étroit. Ça m’est déjà arrivé avec des WordPress sur des petits serveurs lorsque j’essayai d’installer un thème ou une nouvelle extension par exemple.

Cette erreur peut vous paraître d’autant plus étonnante que votre serveur semble posséder une quantité largement suffisante de mémoire vive. En cherchant encore plus loin avec par exemple l’outil de monitoring htop, vous voyez que quand vous exécutez votre script PHP la consommation de RAM de votre code ne semble pas démesurée et aberrante et pourtant vous avez cette erreur Allowed memory size of 134217728 bytes exhausted …

Les cas les plus courants où cette erreur PHP se produit

Comme je vous le disais dans l’introduction, rencontrer cette erreur « Allowed memory size of bytes exhausted » est une chose courante. Elle survient lorsque le script dépasse la limite de mémoire allouée par PHP. Ce problème se manifeste généralement lors du traitement de grandes quantités de données, comme lors de la manipulation d’images de grande taille, de l’exécution de requêtes de base de données complexes ou de la manipulation de fichiers volumineux. L’erreur est le symptôme d’un besoin en ressources mémoire supérieur à ce qui est prévu dans la configuration PHP.

C’est donc pour vous une opportunité d’optimisation qui évitera d’autres problèmes de mémoire vive quand votre application sera en production avec de nombreux utilisateurs. Cette erreur vous force à examiner attentivement le code et la logique de celui-ci pour identifier les sections qui consomment de manière excessive la mémoire. Par exemple, l’utilisation répétée d’opérations sur des tableaux de grande taille ou la création de trop nombreux objets en mémoire peut rapidement saturer la limite allouée. Parfois, une simple petite optimisation suffit à ce que cette erreur ne se produise plus car votre fonction incriminée a été optimisée efficacement. 

Au moins, cette erreur Allowed memory size of * bytes exhausted (tried to allocate * bytes) nous encourage très tôt et pendant la conception de l’application à l’adoption de pratiques de développement plus efficaces. Difficile de couvrir l’ensemble des cas ou elle pourrait se produire, mais cela vous permet de mettre en place l’implémentation de la pagination pour les résultats de base de données ou l’usage de fonctions de traitement de chaînes et de tableaux plus efficientes. La première chose à faire avant de toucher à la configuration de PHP, c’est donc de bien vérifier ce que vous faites avec votre code PHP !

Comment corriger cette erreur Allowed memory size of bytes exhausted tried to allocate bytes

Maintenant, que vous êtes a peu sûr que votre code n’est pas à mettre en cause, on va pouvoir augmenter la limite de mémoire dans la configuration de PHP. Il s’agit de la variable memory_limit. Pour cela, il faut localiser le bon fichier de configuration qui est utilisé en production à l’aide de la commande :

php --ini

Qui me renvoie alors le résultat suivant :

Configuration File (php.ini) Path: /etc/php/8.3/cli
Loaded Configuration File:         /etc/php/8.3/cli/php.ini
Scan for additional .ini files in: /etc/php/8.3/cli/conf.d
Additional .ini files parsed:      /etc/php/8.3/cli/conf.d/10-mysqlnd.ini,

Très, je sais à présent quel fichier est utilisé pour la configuration. Pour ne pas chercher directement dans le fichier (ce que vous pouvez faire) je vais utiliser une commande grep pour avoir l’emplacement exact de cette variable memory_limit avec le numéro la ligne ainsi que sa valeur. Voici la commande grep que vous pouvez utiliser :

grep -n 'memory_limit' /etc/php/8.3/cli/php.ini

Elle me donne le renseignement suivant :

430:memory_limit = 256M

Vous pouvez alors augmenter cette valeur dans les limites du raisonnable et bien évidemment pas au-dessus de la quantité de mémoire vive disponible de votre serveur au risque de rencontrer quelques soucis de performance, voir pire. Ouvrez le bon fichier de configuration et mettez votre nouvelle valeur de mémoire vive limite. Si vous êtes joueurs, vous pouvez mettre la valeur -1 pour supprimer totalement la limite, mais ce n’est pas une bonne pratique.

Une fois que c’est fait en passant par exemple variable à la valeur suivante memory_limit = 512M vous devez redémarrer votre PHP. Dans mon cas, avec NGINX et sur systemd cela se fait facilement avec la commande :

sudo systemctl restart php8.3-fpm

Pour faire une ultime vérification, vous vérifier que le service PHP s’est bien relancé et que tout est ok avec cette dernière commande :

sudo systemctl status php8.3-fpm

Elle devrait normalement vous indiquer quelque chose qui ressemble à ça et qui indique que tout va bien :

● php8.3-fpm.service - The PHP 8.3 FastCGI Process Manager
     Loaded: loaded (/lib/systemd/system/php8.3-fpm.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2024-02-07 11:09:55 UTC; 36s ago
       Docs: man:php-fpm8.3(8)
    Process: 3323583 ExecStartPost=/usr/lib/php/php-fpm-socket-helper install /run/php/php-fpm.sock /etc/php/8.3/fpm>
   Main PID: 3323574 (php-fpm8.3)
     Status: "Processes active: 0, idle: 2, Requests: 1, slow: 0, Traffic: 0req/sec"
      Tasks: 3 (limit: 4662)
     Memory: 71.3M
     CGroup: /system.slice/php8.3-fpm.service
             ├─3323574 php-fpm: master process (/etc/php/8.3/fpm/php-fpm.conf)
             ├─3323581 php-fpm: pool www
             └─3323582 php-fpm: pool www

Vous savez maintenant augmenter la taille limite en mémoire vive que PHP peut consommer pour éviter cette erreur Allowed memory size of * bytes exhausted (tried to allocate * bytes) mais n’oubliez pas que c’est un paramètre à manier avec précaution !

Laisser un commentaire