Question Erreur irrécupérable: taille de mémoire autorisée de 134217728 octets épuisés (CodeIgniter + XML-RPC)


J'ai un tas de systèmes de point de vente client (POS) qui envoient périodiquement de nouvelles données de vente dans une base de données centralisée, qui stocke les données dans une grande base de données pour la génération de rapports.

Le POS client est basé sur PHPPOS, et j'ai implémenté un module qui utilise la bibliothèque standard XML-RPC pour envoyer des données de ventes au service. Le système de serveur est basé sur CodeIgniter et utilise les bibliothèques XML-RPC et XML-RPCS pour le composant Webservice. À chaque fois que j'envoie un grand nombre de données de vente (à partir de 50 lignes de la table de vente et de lignes individuelles de sales_items relatives à chaque article de la vente), j'obtiens l'erreur suivante:

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 54 bytes)

128M est la valeur par défaut dans php.ini, mais je suppose que c'est un nombre énorme à casser. En fait, j'ai même essayé de régler cette valeur à 1024M, et tout ce qu'elle fait, c'est prendre plus de temps à l'erreur.

En ce qui concerne les mesures que j'ai prises, j'ai essayé de désactiver tous les traitements côté serveur, et les ai manipulés pour renvoyer une réponse préprogrammée, quelle que soit l’entrée. Cependant, je pense que le problème réside dans l'envoi réel des données. J'ai même essayé de désactiver le temps d'exécution maximum du script pour PHP, et il y a toujours des erreurs.


474
2018-02-18 13:33


origine


Réponses:


Changer le memory_limit par ini_set('memory_limit', '-1'); est ne pas une bonne solution. S'il vous plaît ne faites pas ça.

Votre code PHP peut avoir une fuite de mémoire quelque part et vous dites au serveur d'utiliser toute la mémoire qu'il veut. Vous n'auriez pas du tout résolu le problème. Si vous surveillez votre serveur, vous verrez qu'il utilise maintenant probablement la plus grande partie de la RAM et même l'échange sur le disque.

Vous devriez probablement essayer de retrouver le code incriminé dans votre code et y remédier.


580
2017-09-06 14:24



ini_set('memory_limit', '-1'); remplace la valeur par défaut Limite de mémoire PHP.


193
2017-10-25 20:42



La bonne façon est de modifier votre php.ini fichier. modifier memory_limit à votre valeur de désir.

A partir de votre question, 128M (qui est la limite par défaut) a été dépassé, donc il y a quelque chose de grave qui ne va pas dans votre code.

Si vous savez pourquoi cela prend beaucoup et que vous voulez lui permettre de définir memory_limit = 512M ou plus haut et vous devriez être bon.


107
2018-03-21 07:29



L'allocation de mémoire pour PHP peut être ajustée de manière permanente ou temporaire.

En permanence

Vous pouvez modifier de façon permanente l'allocation de mémoire PHP de deux manières.

Si vous avez accès à votre php.ini fichier, vous pouvez modifier la valeur de memory_limit à votre valeur de désir.

Si vous n'avez pas accès à votre php.ini fichier (et votre hébergeur le permet), vous pouvez remplacer l’allocation de mémoire via votre .htaccess fichier. Ajouter php_value memory_limit 128M (ou quelle que soit votre allocation désirée).

Temporaire

Vous pouvez ajuster l'allocation de mémoire à la volée dans un fichier PHP. Vous avez simplement le code ini_set('memory_limit', '128M'); (ou quelle que soit votre allocation désirée). Vous pouvez supprimer la limite de mémoire (bien que les limites de machine ou d'instance puissent toujours s'appliquer) en définissant la valeur sur "-1".


76
2018-03-09 14:55



Il est très facile d'obtenir des fuites de mémoire dans un script PHP - surtout si vous utilisez l'abstraction, comme un ORM. Essayez d'utiliser Xdebug pour profiler votre script et savoir où se trouve toute cette mémoire.


53
2018-02-18 14:42



Lors de l'ajout de 22,5 millions d'enregistrements dans un tableau avec array_push, j'ai continué à obtenir des erreurs fatales "mémoire épuisée" à environ 20M enregistrements en utilisant 4G comme limite de mémoire dans php.ini. Pour résoudre ce problème, j'ai ajouté la déclaration

$old = ini_set('memory_limit', '8192M'); 

en haut du fichier. Maintenant tout fonctionne bien. Je ne sais pas si php a une fuite de mémoire, ce n'est pas mon travail, et je m'en fiche. Je dois juste faire mon travail, et cela a fonctionné.

Le programme est très simple:

$fh = fopen($myfile);
while (!feof($fh)) {
      array_push($file, stripslashes(fgets($fh)));
}  
fclose($fh);

L'erreur fatale pointe vers la ligne 3 jusqu'à ce que j'augmente la limite de mémoire, éliminé l'erreur.


39
2018-06-28 05:19



J'ai continué à avoir cette erreur, même avec memory_limit s'installer php.ini, et la valeur lisant correctement avec phpinfo().

En le changeant de ceci:

memory_limit=4G

Pour ça:

memory_limit=4096M

Cela a corrigé le problème en PHP 7.


38
2018-03-13 11:26



Lorsque vous voyez l'erreur ci-dessus - surtout si le (tried to allocate __ bytes) est une valeur faible, qui pourrait être un indicateur d'une boucle infinie, comme une fonction qui s'appelle sans issue:

function exhaustYourBytes()
{
    return exhaustYourBytes();
}

19
2018-05-08 20:09