355 votes

La taille de mémoire autorisée de 33554432 octets est épuisée (tentative d'allocation de 43148176 octets) en php

Ce message d'erreur est présenté, avez-vous des suggestions ?

La taille de mémoire autorisée de 33554432 octets est épuisée (tentative d'allocation de 43148176 octets) dans php

7 votes

Augmentez votre limite de mémoire maximale à 64 Mo dans votre fichier php.ini. Recherche sur Google Mais puis-je demander pourquoi vous essayez d'allouer autant de mémoire ? À quelle ligne de code cela échoue-t-il ?

1 votes

Que fait le script lorsqu'il échoue ? Pouvez-vous afficher le code ?

2 votes

PHP peut être très inefficace en termes d'utilisation de la mémoire, j'ai souvent vu de simples grilles de données dépasser les 80 Mo avec seulement quelques centaines d'enregistrements. Cela semble se produire en particulier lorsque l'on prend la voie de la POO.

397voto

panidarapu Points 2401

Si votre script est attendu pour allouer cette grande quantité de mémoire, alors vous pouvez augmenter la limite de mémoire en ajoutant cette ligne à votre fichier php

ini_set('memory_limit', '44M');

44M est la quantité que vous pensez consommer.

Cependant La plupart du temps, ce message d'erreur signifie que Le script fait quelque chose de mal. et l'augmentation de la limite de mémoire ne fera que produire le même message d'erreur avec des chiffres différents.

Par conséquent, au lieu d'augmenter la limite de mémoire, vous devez réécrire le code afin qu'il n'alloue pas autant de mémoire. Par exemple, en traitant de grandes quantités de données en plus petits morceaux, en désactivant les variables qui contiennent de grandes valeurs mais qui ne sont plus nécessaires, etc.

139 votes

Vous devez quand même vérifier pourquoi la mémoire est épuisée. Vous n'avez peut-être pas besoin de lire tout le fichier, mais plutôt de le lire séquentiellement.

0 votes

Ça a bien marché. Je sais pourquoi La mémoire était épuisée - j'utilise Zend-Feed pour consommer un flux Atom assez important. Je ne peux pas en contrôler la taille ou faire autre chose que d'avaler tout le flux en une seule fois, donc augmenter la limite de mémoire pour cette seule opération a résolu le problème. A la vôtre !

8 votes

- @panidarapu et @Don Jones : En fonction de la quantité de mémoire, et comment ce script est utilisé, il pourrait être dangereux de permettre le changement d'utilisation de la mémoire de cette façon. Don, dans votre cas, vous pouvez probablement décomposer le flux en plus petits morceaux et analyser ce dont vous avez besoin. Je suis heureux que cela fonctionne, mais soyez prudent.

71voto

Haider Abbas Points 183

Voici deux méthodes simples pour augmenter la limite sur un hébergement partagé :

  1. Si vous avez accès à votre fichier PHP.ini, changez la ligne dans PHP.ini Si votre ligne indique 32M, essayez 64M : memory_limit = 64M ; Maximum amount of memory a script may consume (64MB)

  2. Si vous n'avez pas accès à PHP.ini, essayez de l'ajouter à un fichier .htaccess : php_value memory_limit 64M

53voto

Rik Heywood Points 9034

Votre script utilise trop de mémoire. Cela peut souvent se produire en PHP si vous avez une boucle qui a échappé à tout contrôle et que vous créez des objets ou ajoutez à des tableaux à chaque passage de la boucle.

Vérifiez les boucles infinies.

Si ce n'est pas le problème, essayez d'aider PHP en détruisant les objets dont vous avez fini de vous occuper en leur donnant la valeur null, par exemple. $OldVar = null;

Vérifiez également le code où l'erreur se produit réellement. Vous vous attendriez à ce que cette ligne alloue une quantité massive de mémoire ? Si ce n'est pas le cas, essayez de comprendre ce qui a mal tourné...

3 votes

J'ai eu exactement le même problème - il s'est avéré que j'avais créé par inadvertance une fonction récursive - et donc qu'elle manquait de mémoire à n'importe quel moment de l'exécution du code. L'avantage est que j'ai maintenant le code le plus efficace du monde en termes de mémoire, créé dans le cadre d'une chasse aux fuites de mémoire.

1 votes

Pour le bien des autres qui vont poursuivre un lapin dans un trou. Doctrine dans Symfony a, je pense, un problème avec Monolog et lorsqu'il y a une exception PDO, il crée une boucle infinie d'exceptions car il essaie une exception pour l'exception, cachant ainsi le vrai problème (un fichier BD corrompu dans mon cas).

21voto

staticsan Points 14435

Il est malheureusement facile de programmer en PHP d'une manière qui consomme de la mémoire plus rapidement que vous ne le pensez. Copier des chaînes, des tableaux et des objets au lieu d'utiliser des références le fera, bien que PHP 5 soit censé le faire plus automatiquement que PHP 4. Mais traiter l'ensemble de vos données en plusieurs étapes est aussi un gaspillage par rapport au traitement de la plus petite unité logique à la fois. L'exemple classique est le travail avec de grands ensembles de résultats provenant d'une base de données : la plupart des programmeurs récupèrent l'ensemble des résultats dans un tableau, puis bouclent dessus une ou plusieurs fois avec la commande foreach() . Il est beaucoup plus efficace en termes de mémoire d'utiliser un while() pour récupérer et traiter une ligne à la fois. Il en va de même pour le traitement d'un fichier.

0 votes

Il semble assez probable que c'est ce qui le fait.

15voto

Gumbo Points 279147

Si vous voulez lire des fichiers volumineux, vous devez les lire petit à petit au lieu de les lire en une seule fois.
C'est un calcul simple : Si vous lisez un fichier de 1 Mo en une seule fois, au moins 1 Mo de mémoire est nécessaire pour contenir les données.

Vous devez donc les lire petit à petit en utilisant fopen & fread .

1 votes

J'ai résolu ce problème en utilisant : $fh = fopen($folder.'/'.$filename, "rb") or die(); $buffer = 1024*1024; while (!feof($fh)) { print(fread($fh, $buffer)); flush(); } fclose($fh);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X