La taille de mémoire autorisée de 33554432 octets est épuisée (a tenté d'allouer 43148176 octets) en php

279

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

La taille de mémoire autorisée de 33554432 octets est épuisée (a tenté d'allouer 43148176 octets) en php

panidarapu
la source
5
Augmentez votre limite de mémoire maximale à 64 Mo dans votre fichier php.ini. Recherche Google Mais pourrais-je vous demander pourquoi vous essayez d'allouer autant de mémoire? À quelle ligne de code échoue-t-il?
1
Que fait le script en cas d'échec? pouvez-vous poster le code?
Neil Aitken
3
On dirait un très gros fichier txt.
macbirdie
10
Classiquement, vous lisez une ligne à la fois des fichiers potentiellement volumineux ou arbitraires, en écrasant la mémoire de la ligne précédente à chaque ligne lue. Ou vous pouvez simplement vouloir suivre ou diriger le fichier pour obtenir les dernières entrées. Augmenter votre allocation de mémoire à mesure que le fichier se développe n'est pas la réponse.
ekerner

Réponses:

319

J'ai enfin trouvé la réponse:

Ajoutez simplement cette ligne ci-dessous à la ligne avant que vous n'obteniez une erreur dans votre fichier

ini_set('memory_limit', '-1');

Il faudra une utilisation illimitée de la mémoire du serveur, cela fonctionne bien.

Merci d'avoir donné des suggestions d'amis.

panidarapu
la source
125
Vous devez toujours vérifier pourquoi la mémoire est épuisée. Peut-être que vous n'avez pas besoin de lire le fichier entier, peut-être de le lire séquentiellement.
macbirdie
8
- @panidarapu et @Don Jones: Selon la quantité de mémoire et la façon dont ce script est utilisé, il pourrait être dangereux d'autoriser le changement d'utilisation de la mémoire de cette manière. Don, dans votre cas, vous pouvez probablement diviser le flux en morceaux plus petits et analyser ce dont vous avez besoin. Heureux que cela fonctionne, mais soyez prudent.
lâche anonyme
5
Cette suggestion a fonctionné pour moi. L'augmentation dynamique de la limite de mémoire dans le script se fait via la fonction ini_set (): ini_set ('memory_limit', '128M');
mente
37
Les gars, veuillez ne pas opter pour cette solution rapide. Cela peut vous blesser à long terme. En tant que bon programmeur, vous devez comprendre la raison de cette consommation de mémoire et augmenter au besoin au lieu de la conserver UNLIMITED.
Sumoanand
113
Wow, cette réponse massivement votée me semble être une très mauvaise pratique. -1!
Ambidex
59

Voici deux méthodes simples pour augmenter la limite d'hébergement mutualisé:

  1. Si vous avez accès à votre fichier PHP.ini, changez la ligne dans PHP.ini Si votre ligne affiche 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

Haider Abbas
la source
47

Votre script utilise trop de mémoire. Cela peut souvent se produire en PHP si vous avez une boucle qui est hors de 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 avec lesquels vous avez terminé en les définissant sur null. par exemple.$OldVar = null;

Vérifiez également le code dans lequel l'erreur se produit. Vous attendriez-vous à ce que cette ligne alloue une énorme quantité de mémoire? Sinon, essayez de comprendre ce qui ne va pas ...

Rik Heywood
la source
3
J'ai eu ce problème exact - il s'est avéré que j'avais créé par inadvertance une fonction récursive - et donc il a manqué de mémoire à tout moment au cours de l'exécution du code. Cela avait l'avantage que j'avais maintenant le code le plus efficace au monde en matière de mémoire, créé dans la recherche d'une fuite de mémoire.
Kris Selbekk
1
Pour le bien des autres qui chasseront un lapin dans un trou. Doctrine in Symfony je pense qu'il y a un problème avec monolog et quand il y a une exception PDO cela créera une boucle infinie d'exceptions car il essaiera une exception pour l'exception cachant ainsi le vrai problème (un fichier db corrompu dans mon cas).
Desislav Kamenov
39

Faire :

ini_set('memory_limit', '-1');

n'est jamais bon. Si vous souhaitez lire un fichier très volumineux, il est recommandé de le copier petit à petit. Essayez le code suivant pour les meilleures pratiques.

$path = 'path_to_file_.txt';

$file = fopen($path, 'r');
$len = 1024; // 1MB is reasonable for me. You can choose anything though, but do not make it too big
$output = fread( $file, $len );

while (!feof($file)) {
    $output .= fread( $file, $len );
}

fclose($file);

echo 'Output is: ' . $output;
Delali
la source
6
Je ne peux pas croire que tous ces gens recommandent de mettre memory_limit à -1 ... Chose folle à faire sur un serveur de production. Merci pour une solution beaucoup plus propre.
JohnWolf
2
Bien qu'à la "meilleure pratique", il est bon de fermer le gestionnaire de fichiers après la whileboucle:fclose($file)
kodeart
2
@assetCorp Comment cela aide-t-il, à condition que le fichier ait par exemple 100 Mo et que la limite de mémoire PHP soit toujours fixée à 32 Mio. Vous le lisez par morceaux sécurisés de 1 Mo, mais vous l'ajoutez ensuite dans une variable qui va utiliser toute la mémoire disponible une fois que la boucle atteindra 31. itération. Comment est-ce mieux? Seule la sortie des morceaux de la même manière pour ne pas nécessiter de les stocker tous dans une variable aiderait à résoudre le problème.
helvete
17

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 qu'en PHP 4. Mais traiter l'ensemble de vos données en plusieurs étapes est également un gaspillage par rapport au traitement de la plus petite unité logique. à la fois. L'exemple classique fonctionne avec des ensembles de résultats volumineux à partir d'une base de données: la plupart des programmeurs récupèrent l'intégralité de l'ensemble de résultats dans un tableau, puis le bouclent une ou plusieurs fois avec foreach(). Il est beaucoup plus efficace en mémoire d'utiliser une while()boucle pour extraire et traiter une ligne à la fois. La même chose s'applique au traitement d'un fichier.

staticien
la source
Il semble assez probable que c'est ce qu'il fait.
Kzqai
13

Si vous souhaitez lire des fichiers volumineux, vous devez les lire petit à petit au lieu de les lire immédiatement.
C'est un calcul simple: si vous lisez un gros fichier de 1 Mo à la fois, au moins 1 Mo de mémoire est nécessaire en même temps pour contenir les données.

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

Gombo
la source
1
Résolu cela en utilisant:$fh = fopen($folder.'/'.$filename, "rb") or die(); $buffer = 1024*1024; while (!feof($fh)) { print(fread($fh, $buffer)); flush(); } fclose($fh);
Kai Noack
12

J'ai rencontré le même problème dans php7.2 avec laravel 5.6. J'augmente simplement la quantité de variable memory_limit = 128Mdans php.ini à la demande de mes applications. Il pourrait être 256M / 512M / 1048M ..... Maintenant, cela fonctionne bien.

Ziaur Rahman
la source
6

J'avais aussi le même problème, j'ai cherché des fichiers phpinfo.ini, php.ini ou .htaccess en vain. Enfin, j'ai regardé certains fichiers php, les ai ouverts et vérifié les codes à l'intérieur pour la mémoire. Enfin, cette solution a été ce que je suis sorti et cela a fonctionné pour moi. J'utilisais wordpress, donc cette solution pourrait ne fonctionner que pour un problème de limite de taille de mémoire wordpress. Ma solution, ouvrez le fichier default-constants.php dans le dossier / public_html / wp-includes . Ouvrez ce fichier avec l'éditeur de code et recherchez les paramètres de mémoire sous la wp_initial_constantsportée, ou tout simplement Ctrl + F pour trouver le mot "mémoire". Là, vous viendrez WP_MEMORY_LIMITet WP_MAX_MEMORY_LIMIT. Il suffit de l'augmenter, il était de 64 Mo dans mon cas, je l'ai augmenté à 128 Mo puis à 200 Mo.

// Define memory limits.
if ( ! defined( 'WP_MEMORY_LIMIT' ) ) {
    if ( false === wp_is_ini_value_changeable( 'memory_limit' ) ) {
        define( 'WP_MEMORY_LIMIT', $current_limit );
    } elseif ( is_multisite() ) {
        define( 'WP_MEMORY_LIMIT', '200M' );
    } else {
        define( 'WP_MEMORY_LIMIT', '128M' );
    }
}

if ( ! defined( 'WP_MAX_MEMORY_LIMIT' ) ) {
    if ( false === wp_is_ini_value_changeable( 'memory_limit' ) ) {
        define( 'WP_MAX_MEMORY_LIMIT', $current_limit );
    } elseif ( -1 === $current_limit_int || $current_limit_int > 268435456 /* = 256M */ ) {
        define( 'WP_MAX_MEMORY_LIMIT', $current_limit );
    } else {
        define( 'WP_MAX_MEMORY_LIMIT', '256M' );
    }
}

Btw, veuillez ne pas faire le code suivant, car c'est une mauvaise pratique:

ini_set('memory_limit', '-1');
garakchy
la source
1
Fonctionne pour les sites Web wordpress, où l'accès n'est pas disponible pour les fichiers .htaccess et php.ini. +1
Mustafa sabir
Je dirais que changer ces limites sur un fichier WordPress «de base» n'est pas vraiment une bonne idée; vous pouvez donc très facilement ajouter ces limites à la wp-config.phpplace, où elles ne seront pas écrasées par les futures mises à jour de WordPress. De plus, quelques plugins de sécurité (tels que WordFence, par exemple) se plaindront si les fichiers WordPress `` principaux '' sont modifiés ...
Gwyneth Llewelyn
1
@GwynethLlewelyn Je ne sais pas comment faire, pouvez-vous élaborer, s'il vous plaît?
garakchy
1
Oh ... il suffit de modifier wp-config.phpet d'ajouter les deux lignes là-bas (c'est-à-dire define( 'WP_MEMORY_LIMIT', '200M' );et define( 'WP_MAX_MEMORY_LIMIT', '256M' );. Contrairement aux fichiers sur le WP «de base» (à savoir, tout ce qui se trouve sous wp-includes), qui seront écrasés par les mises à niveau de WP, wp-config.phpne le seront pas - il est là exactement pour le but exact de remplacer les constantes WP!
Gwyneth Llewelyn
1
la «mauvaise pratique» est situationnelle. -1convient parfaitement aux processus à court terme. Par exemple, un conteneur de constructeur php utilisé pour exécuter des tests unitaires ou des installations de composeur / etc. Ne faites pas fonctionner votre site de production avec ce jeu comme ça.
emmdee
5

Vous pouvez augmenter la mémoire autorisée pour le script php en exécutant la ligne suivante au-dessus de tous les codes du script:

ini_set('memory_limit','-1'); // enabled the full memory available.

Et également allouer les variables indésirables dans le script.

Vérifiez cette bibliothèque php: Libérer de la mémoire avec PHP

Sanjay Kumar NS
la source
4
ini_set('memory_limit', '-1');
Định Nguyễn Thế
la source
3
@Pang ini_set ('memory_limit', '-1');
DIGITALCRIMINAL
3

Je remarque que de nombreuses réponses essaient simplement d'augmenter la quantité de mémoire accordée à un script qui a sa place, mais le plus souvent cela signifie que quelque chose est trop libéral avec la mémoire en raison d'une quantité imprévue de volume ou de taille. Évidemment, si vous n'êtes pas l'auteur d'un script, vous êtes à la merci de l'auteur, sauf si vous vous sentez ambitieux :) Les documents PHP disent même que les problèmes de mémoire sont dus à des " scripts mal écrits "

Il convient de mentionner que ini_set('memory_limit', '-1');(pas de limite) peut provoquer une instabilité du serveur comme 0 bytes free = bad things. Au lieu de cela, trouvez un équilibre raisonnable par ce que votre script essaie de faire et la quantité de mémoire disponible sur une machine.

Une meilleure approche: si vous êtes l'auteur du script (ou ambitieux), vous pouvez déboguer de tels problèmes de mémoire avec xdebug . La dernière version (2.6.0 - publiée le 2018-01-29) a ramené le profilage de la mémoire qui vous montre quels appels de fonction consomment de grandes quantités de mémoire. Il expose des problèmes dans le script qui sont autrement difficiles à trouver. Habituellement, les inefficacités sont dans une boucle qui n'attend pas le volume qu'il reçoit, mais chaque cas sera laissé au lecteur comme un exercice :)

La documentation de xdebug est utile, mais elle se résume à 3 étapes:

  1. Installez-le - Disponible via apt-getet yumetc
  2. Configurez - - xdebug.ini: xdebug.profiler_enable = 1,xdebug.profiler_output_dir = /where/ever/
  3. Afficher les profils dans un outil comme QCacheGrind , KCacheGrind
SeanDowney
la source
2

Si vous essayez de lire un fichier, cela prendra de la mémoire en PHP. Par exemple, si vous essayez d'ouvrir et de lire un fichier MP3 (comme, par exemple, $ data = file (" http://mydomain.com/path/sample.mp3 "), il va tout mettre en mémoire .

Comme le suggère Nelson, vous pouvez travailler pour augmenter votre limite de mémoire maximale si vous avez réellement besoin d'utiliser autant de mémoire.

Beau Simensen
la source
2

Nous avons eu une situation similaire et nous avons essayé donné en haut des réponses ini_set ('memory_limit', '-1'); et tout fonctionnait bien, les fichiers d'images compressées supérieurs à 1 Mo en Ko.

flux dynamique
la source
1

Écrire

ini_set('memory_limit', '-1');

dans votre index.php en haut après l'ouverture de la balise php

Prafull
la source
1

Je recevais le même message d'erreur après être passé à un nouveau thème dans Wordpress. PHP exécutait la version 5.3, je suis donc passé à 7.2. Cela a résolu le problème.

DavGarcia
la source
1

Si vous utilisez un hébergement partagé, vous ne pourrez pas appliquer l'incrément dans la limite de taille php.

Accédez simplement à votre cpanel et mettez à niveau votre version php vers 7.1 et au-dessus, alors vous êtes prêt à partir.

successtar
la source
0

les utilisateurs de wordpress ajoutent une ligne:

@ini_set('memory_limit', '-1');

dans wp-settings.php que vous pouvez trouver dans le dossier racine installé de wordpress

Praveesh P
la source
0

Je n'avais pas renouvelé mon hébergement et la base de données était en lecture seule. Joomla avait besoin d'écrire la session et n'a pas pu le faire.

Alberto M
la source
0

J'ai eu le même problème que l'exécution de php en ligne de commande. Récemment, j'ai changé le fichier php.ini et j'ai fait une erreur en changeant le php.ini

C'est pour php7.0

chemin vers php.ini où j'ai fait une erreur: /etc/php/7.0/cli/php.ini

J'avais défini memory_limit = 256(ce qui signifie 256 bytes)
au lieu de memory_limit = 256M(ce qui signifie 256 Mega bytes).

; Quantité maximale de mémoire qu'un script peut consommer (128 Mo)
; http://php.net/memory-limit
memory_limit = 128M

Une fois que je l'ai corrigé, mon processus a commencé à bien fonctionner.

theBuzzyCoder
la source
0

Exécutez cette commande dans votre répertoire racine Magento php -d memory_limit=4G bin/magento

Mohammed Muzammil
la source
-1

si vous utilisez laravel, utilisez ces méthodes

public function getClientsListApi(Request $request){ print_r($request->all()); //for all request print_r($request->name); //for all name }

au lieu de

public function getClientsListApi(Request $request){ print_r($request); // it show error as above mention }

Ajay
la source