674 votes

Erreur fatale : La taille mémoire autorisée de 134217728 octets est épuisée (CodeIgniter + XML-RPC)

J'ai plusieurs systèmes de point de vente (POS) de clients qui envoient périodiquement les nouvelles données de vente à 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 les données de vente au service. Le système serveur est construit sur CodeIgniter, et utilise les bibliothèques XML-RPC et XML-RPCS pour le composant webservice. Chaque fois que j'envoie beaucoup de données sur les ventes (aussi peu que 50 lignes de la table des ventes, et des lignes individuelles de sales_items se rapportant à 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 fixer cette valeur à 1024M, et tout ce que cela fait, c'est prendre plus de temps pour se tromper.

Pour ce qui est des mesures que j'ai prises, j'ai essayé de désactiver tous les traitements du côté serveur et j'ai fait en sorte que le serveur renvoie une réponse standard quelle que soit l'entrée. Cependant, je pense que le problème réside dans l'envoi effectif des données. J'ai même essayé de désactiver le temps d'exécution maximum de script pour PHP, et il y a toujours des erreurs.

5 votes

Je suis un peu perdu... où l'erreur se produit-elle - dans le client ou le serveur ? Et à quelle étape... envoi par le client, réception par le serveur, traitement par le serveur, envoi par le serveur, réception par le client ou traitement par le client ?

0 votes

Comment/où définissez-vous la limite de mémoire à 1024M ?

2 votes

L'erreur semble se produire soit pendant l'envoi par le client, soit pendant la réception par le serveur. J'ai essayé de désactiver tous les traitements côté serveur et de faire en sorte qu'il envoie une réponse fixe, quelles que soient les données envoyées. L'erreur se produit si j'envoie plus d'une certaine quantité de données. Je modifie le paramètre PHP.ini.

760voto

Jeff Points 718

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

Votre code PHP a peut-être 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 probablement la majeure partie de la RAM et qu'il effectue même des échanges sur le disque.

Vous devriez probablement essayer de retrouver le code incriminé dans votre code et le corriger.

185 votes

@Jeff vous avez probablement raison 95% du temps. Cependant, il y a des moments où vous avez réellement besoin de plus de mémoire. Par exemple, disons que votre application charge une quantité massive de données en mémoire pour les traiter (disons une nomenclature avec 15 000 composants). Ce n'est pas toujours que le code est bogué, parfois vous avez juste besoin d'un peu plus de mémoire (par exemple 256M au lieu de 128M). Cependant, je suis d'accord pour dire que la fixer à -1 est une très mauvaise idée. Mais ajuster la limite de mémoire pour des situations raisonnables lors de l'exécution est parfaitement acceptable.

27 votes

@pyrite oui vous avez raison que parfois un processus nécessite plus de mémoire mais vous devriez augmenter la limite de mémoire à un montant logique comme 256MB comme vous l'avez dit ou 512MB pourquoi pas MAIS pas -1 ;)

9 votes

@jeff Je suis entièrement d'accord, une valeur de -1 pourrait être utile uniquement dans des environnements de développement à des fins de test.

210voto

Chris Lane Points 1697

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

1 votes

Où doit-on changer cela ? Je ne trouve que cette ligne dans php.ini

2 votes

Dans certaines situations où vous avez absolument besoin que quelque chose se termine et que vous reveniez ensuite à un réglage raisonnable, cela aide vraiment.

16 votes

@williamcarswell ; -1 est une valeur que PHP comprend comme illimité dans ce contexte.

145voto

Basav Points 366

La bonne méthode consiste à modifier votre php.ini fichier. Modifier memory_limit à la valeur de votre désir.

Comme pour votre question, 128M (qui est la limite par défaut) a été dépassée, il y a donc quelque chose de sérieusement erroné dans votre code car cela ne devrait pas prendre autant de temps.

Si vous savez pourquoi il en faut autant et que vous voulez l'autoriser, réglez memory_limit = 512M ou plus et vous devriez être bon.

7 votes

Honnêtement, si vous mettez en cache des quantités importantes de données, c'est la bonne réponse. 128M n'est pas suffisant pour certains scripts. 512M ou 1024M seront souvent suffisants, mais vous devez décider au cas par cas.

2 votes

Yeha, cependant, essayez d'éviter une utilisation massive de la mémoire, si le nombre d'utilisateurs est plus élevé.

2 votes

Memory_limit = -1 ; défini dans le php.ini

104voto

Umair Idrees Points 31

L'allocation de mémoire pour PHP peut être ajustée de façon permanente ou temporaire.

En permanence

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

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

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

Temporaire

Vous pouvez ajuster l'allocation de mémoire à la volée à partir d'un fichier PHP. Il vous suffit d'avoir le code ini_set('memory_limit', '128M'); (ou l'allocation que vous souhaitez). 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 à "-1".

2 votes

Merci. Je n'ai pas pensé à vérifier si quelqu'un n'avait pas mis la valeur dans le fichier .htaccess qui remplaçait le fichier php.ini et je n'ai pas pu comprendre pourquoi +1.

0 votes

Pour tous ceux qui ont besoin d'un jeu temporaire avec des commandes : php -d memory_limit=256M your_php_file.php ou php -d memory_limit=256M artisan ...

64voto

troelskn Points 51966

Il est très facile d'avoir des fuites de mémoire dans un script PHP - surtout si vous utilisez une abstraction, comme un ORM. Essayez d'utiliser Xdebug pour profiler votre script et découvrez où toute cette mémoire est allée.

1 votes

Je vais essayer Xdebug. Je ne l'ai jamais utilisé auparavant, je vais donc devoir me documenter. Merci de m'avoir répondu ! J'espère que je trouverai bientôt la réponse à cette question...

35 votes

Rappelez-vous que PHP utilise le comptage de références pour gérer la mémoire. Donc si vous avez des références circulaires, ou des variables globales, ces objets ne seront pas recyclés. C'est généralement la cause des fuites de mémoire en PHP.

0 votes

Xdebug montre que la bibliothèque Xmlrpc.php de CI est responsable de ma fuite de mémoire. Par hasard, y aurait-il des problèmes avec les bibliothèques XML-RPC de CodeIgniter que je devrais connaître ? J'ai essayé de désactiver tout traitement côté serveur, et il manque toujours de mémoire si je lui fournis suffisamment de données.

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