« Allowed Memory Size of 134217728 Bytes Exhausted » — le couperet de votre application PHP
\n\nAvez-vous déjà vu ce message en pleine nuit, lorsque votre site plante soudainement et que les logs affichent une inscription blanche sur fond noir ? Si oui, vous n'êtes pas seul. Des milliers de développeurs sur Stack Overflow se sont demandé pourquoi leur script PHP, pourtant anodin, dévore soudainement les 128 Mo de RAM et se termine par une erreur fatale.
\n\nVoyons ensemble ce que signifie réellement cette erreur, pourquoi elle se produit et, surtout, comment la corriger définitivement. Nous n'allons pas simplement augmenter la limite mémoire — nous allons apprendre à écrire un code qui ne gaspille pas les ressources comme un étudiant affamé à la cantine.
\n\nQue signifie « 134217728 Bytes Exhausted » ?
\n\nLe nombre 134 217 728 correspond à 128 Mo. C'est la quantité de mémoire que PHP est autorisé à utiliser par défaut pour votre script. Lorsque le script tente d'en allouer davantage — boum ! — vous obtenez une Fatal Error. C'est un mécanisme de protection qui empêche un seul script de faire tomber tout le serveur.
Mais voici le piège : 128 Mo, c'est très peu pour les applications modernes. Traiter un gros fichier XML, générer un rapport depuis une base de données, travailler avec des images ou des bibliothèques lourdes — tout cela peut facilement dépasser la limite.
\n\nPourquoi cela arrive-t-il ? Les trois causes principales
\n\n- \n
- Boucles gourmandes et récursion — lorsque vous chargez toutes les données en mémoire d'un coup, au lieu de les traiter par lots. \n
- Fuites mémoire — les variables statiques, les tableaux globaux et une mauvaise utilisation de
staticpeuvent accumuler des données. \n - Bibliothèques et extensions lourdes — par exemple, le traitement d'images via GD ou le travail avec des PDF. \n
Comment corriger l'erreur : du plus simple au plus avancé
\n\nMéthode 1 : Augmenter la limite mémoire (solution rapide)
\n\nLa solution la plus évidente est de donner plus de mémoire à PHP. Mais rappelez-vous : ce n'est pas un traitement, c'est un antidouleur. Si votre code est mal écrit, il dévorera aussi bien 512 Mo que 1 Go.
\n\nIl existe trois façons d'augmenter la limite :
\n\n1. Dans le fichier php.ini (modification permanente) :
\nmemory_limit = 256M\n\n2. Dans .htaccess (si accessible) :
\nphp_value memory_limit 256M\n\n3. Directement dans le script (uniquement pour l'exécution en cours) :
\nini_set('memory_limit', '256M');\n\nMais attention : si vous êtes sur un hébergement mutualisé, l'hébergeur peut ne pas autoriser l'augmentation au-delà d'un certain seuil. Et même s'il le permet — n'en abusez pas.
\n\nMéthode 2 : Optimiser le code — la vraie solution
\n\nAu lieu de donner plus de mémoire à votre script, apprenons-lui à utiliser ce qu'il a de manière intelligente.
\n\nUtilisez unset() pour libérer la mémoire
\n\nPHP n'est pas du C++, mais la gestion manuelle de la mémoire fonctionne toujours. Quand une grosse variable n'est plus nécessaire — supprimez-la :
\n\n$data = file_get_contents('fichier_volumineux.csv');\n// traiter les données\ntraiterDonnees($data);\n// libérer la mémoire\nunset($data);\n\n\nTraitez les données par lots
\n\nAu lieu de charger 100 000 lignes d'une base de données en mémoire, utilisez des curseurs ou des limites :
\n\n// MAUVAIS : tout charger en mémoire\n$utilisateurs = $db->query("SELECT * FROM utilisateurs")->fetchAll();\n\n// BON : traiter ligne par ligne\n$stmt = $db->query("SELECT * FROM utilisateurs");\nwhile ($ligne = $stmt->fetch()) {\n traiterUtilisateur($ligne);\n // PHP libère automatiquement la mémoire après chaque itération\n}\n\n\nUtilisez les générateurs (yield)
\n\nLes générateurs sont magiques pour travailler avec de grands ensembles de données. Ils ne stockent pas toutes les valeurs en mémoire :
\n\nfunction obtenirGrandesDonnees() {\n for ($i = 0; $i < 1000000; $i++) {\n yield $i;\n }\n}\n\nforeach (obtenirGrandesDonnees() as $valeur) {\n // traiter un élément à la fois\n echo $valeur . "\\n";\n}\n\n