Script PHP qui consomme 128 Mo : causes et solutions

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

« Allowed Memory Size of 134217728 Bytes Exhausted » — le couperet de votre application PHP

\n\n

Avez-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\n

Voyons 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\n

Que signifie « 134217728 Bytes Exhausted » ?

\n\n

Le 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.

\n\n

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\n

Pourquoi 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 static peuvent 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
\n\n

Comment corriger l'erreur : du plus simple au plus avancé

\n\n

Méthode 1 : Augmenter la limite mémoire (solution rapide)

\n\n

La 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\n

Il existe trois façons d'augmenter la limite :

\n\n

1. Dans le fichier php.ini (modification permanente) :

\n
memory_limit = 256M
\n\n

2. Dans .htaccess (si accessible) :

\n
php_value memory_limit 256M
\n\n

3. Directement dans le script (uniquement pour l'exécution en cours) :

\n
ini_set('memory_limit', '256M');
\n\n

Mais 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\n

Méthode 2 : Optimiser le code — la vraie solution

\n\n

Au lieu de donner plus de mémoire à votre script, apprenons-lui à utiliser ce qu'il a de manière intelligente.

\n\n

Utilisez unset() pour libérer la mémoire

\n\n

PHP 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\n

Traitez les données par lots

\n\n

Au 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\n

Utilisez les générateurs (yield)

\n\n

Les 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\n
function 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

Blogs

Book Recommendations