PHP Fatal Error: Allowed Memory Size — brisons les mythes et configurons

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Introduction : pourquoi votre script PHP « explose » ?

\n\n

Avez-vous déjà vu un écran blanc avec le message glaçant « Fatal Error: Allowed Memory Size of 134217728 Bytes Exhausted » ? Si oui, vous n'êtes pas seul. Cette question sur Stack Overflow a recueilli des milliers de vues, et un développeur PHP sur deux l'a rencontrée au moins une fois dans sa vie.

\n\n

Le nombre 134217728 octets correspond exactement à 128 mégaoctets (la limite standard pour de nombreux hébergements). Lorsque votre script tente d'en utiliser davantage, PHP dit « stop » et génère une erreur fatale. Mais ne paniquez pas ! Dans cet article, nous allons voir pourquoi cela se produit, comment le corriger et, surtout, comment optimiser les performances pour que cette erreur de mémoire ne vous inquiète plus.

\n\n

Cet article est rédigé pour le site éducatif PythonLib, mais tout le code et les exemples sont en PHP. C'est parti !

\n\n

Qu'est-ce que memory_limit et d'où vient « 134217728 » ?

\n\n

En PHP, il existe la directive memory_limit qui définit la quantité maximale de mémoire disponible pour un script. Par défaut, dans de nombreuses configurations (notamment sur les hébergements mutualisés), la valeur est 128M (soit 134217728 octets).

\n\n

Vous pouvez vérifier la limite actuelle ainsi :

\n\n
<?php\necho ini_get('memory_limit'); // Affichera par exemple "128M"\n?>
\n\n

Lorsque votre script dépasse cette limite, PHP termine immédiatement l'exécution avec une erreur fatale. Les causes peuvent être variées : code non optimal, chargement de fichiers volumineux en mémoire, etc.

\n\n

Scénarios typiques provoquant l'erreur

\n\n
    \n
  • Travail avec de grands tableaux — par exemple, lire un fichier CSV entièrement en mémoire.
  • \n
  • Boucles avec fuites — oubli de libérer des variables ou utilisation de tableaux globaux.
  • \n
  • Bibliothèques de traitement d'images — GD ou Imagick lors du travail avec des photos haute résolution.
  • \n
  • Fonctions récursives — sans condition de base, elles deviennent infinies et consomment la pile.
  • \n
  • ORM et mise en cache — certains ORM (comme Doctrine) peuvent charger une table entière en mémoire.
  • \n
\n\n

Comment corriger l'erreur : 3 méthodes éprouvées

\n\n

1. Augmentation temporaire de la limite avec ini_set()

\n\n

La méthode la plus rapide consiste à augmenter la limite directement dans le script :

\n\n
<?php\nini_set('memory_limit', '256M');\n// Désormais, le script peut utiliser jusqu'à 256 Mo\n?>
\n\n

Important : cela ne fonctionne que si votre hébergement autorise la redéfinition de la directive. Sur certains hébergements, ini_set() pour memory_limit est bloqué.

\n\n

2. Modification de php.ini ou .htaccess

\n\n

Si vous avez accès au serveur, modifiez php.ini :

\n\n
memory_limit = 256M
\n\n

Ou via .htaccess (sur Apache) :

\n\n
php_value memory_limit 256M
\n\n

Après les modifications, redémarrez le serveur web ou PHP-FPM.

\n\n

3. Optimisation du code — la meilleure solution

\n\n

Augmenter la limite est une solution de fortune. La vraie solution est d'écrire un code efficace. Examinons des exemples.

\n\n

Exemple concret : traitement d'un gros fichier CSV

\n\n

Supposons que vous ayez un fichier CSV de 500 000 lignes. Un code naïf pourrait ressembler à ceci :

\n\n
<?php\n$rows = file('data.csv'); // Charge TOUT le fichier en mémoire !\nforeach ($rows as $row) {\n    // traitement\n}\n?>
\n\n

Avec un fichier de 200 Mo, le script plantera avec une erreur de mémoire.

\n\n

Optimisation : lecture ligne par ligne

\n\n
<?php\n$handle = fopen('data.csv', 'r');\nif ($handle) {\n    while (($row = fgetcsv($handle)) !== false) {\n        // traite une ligne à la fois\n        // la mémoire n'augmente presque pas\n    }\n    fclose($handle);\n}\n?>
\n\n

Désormais, le script n'utilise que quelques mégaoctets, quelle que soit la taille du fichier.

\n\n<

Blogs

Book Recommendations