Comment avez-vous débogage php “Out of Memory” des questions?
J'ai eu quelques problèmes ces derniers temps avec PHP les limites de la mémoire dernièrement:
De mémoire (attribué 22544384) (tried to allocate 232 octets)
Ils sont assez nuisances debug depuis que je ne suis pas de gauche avec beaucoup d'infos sur ce qui a causé le problème.
L'ajout d'une fonction d'arrêt a aidé
register_shutdown_function('shutdown');
puis, à l'aide de error_get_last(); je peux obtenir des informations sur la dernière erreur, dans ce cas, le "Out of memory" erreur fatale, telles que le numéro de la ligne, et le php de nom de fichier.
C'est bien joli, mais mon programme php est fortement orientée objet. Une erreur profonde dans la pile ne m'en dit pas beaucoup sur le contrôle de la structure ou de la pile d'exécution au moment de l'erreur. J'ai essayé debug_backtrace(),, mais cela me montre la pile lors de l'arrêt, pas la pile au moment de l'erreur.
Je sais que je peux lever la limite de la mémoire à l'aide de la fonction ini_set ou de modifier le php.ini, mais qui n'est pas moi plus près de la réalité de déterminer ce que consomme une grande quantité de mémoire ou de ce que mon flux d'exécution ressemble à l'erreur.
Quelqu'un a une bonne méthodologie pour le débogage des erreurs de mémoire avancé Orienté Objet PHP programmes?
- 232 octets, et vous obtenez un problème de mémoire? o.O
- Ce que vous stockez dans votre objets que j'avais besoin+ de 20 mégas de ram?
- PHP meurt parce qu'il ne peut pas allouer de 232 octets sur le dessus de ce qu'il a déjà alloué jusqu'à présent (ce qui est la limite de la mémoire).
- Voir PHP le profilage de la mémoire.
- c'est ce que j'essaie de trouver 😛
- merci - xdebug semble être une bonne solution pour quand, j'ai déjà quelques pistes sur la question. le problème que j'ai c'est que je ne sais rien sur les autres questions que le numéro de ligne et le nom de fichier que l'erreur s'est produite sur.
- Var_dumps + sorties. Beaucoup de var_dumps & sorties.... Ou, de préférence, xdebug!
- les endroits à vérifier: la répétition d'une chaîne de construction, de manipulation de fichiers (en particulier le chargement des images de grande taille via GD et autres), la construction de grands fichiers Excel, etc...), la matrice de la construction. Tout en PHP prend plus de mémoire que les données brutes suggère qu'elle serait, en raison de PHP moteur de frais généraux.
- Certains très connus des bibliothèques (tels que la Doctrine ou le framework Symfony) créer d'incroyables quantités d'objets. En Particulier, La Doctrine. J'ai dû le réécrire toute une partie d'une application à la fois afin d'éviter la Doctrine, parce qu'il a été unusably lent.
Vous devez vous connecter pour publier un commentaire.
Je l'utilise pour imprimer une liste de variables assignées juste avant une section de problème de mon code, avec un (très) estimation approximative de la taille de la variable. - Je revenir en arrière et
unset
tout ce qui n'est pas nécessaire, et au-delà du point d'intérêt.Il est utile lors de l'installation d'une extension n'est pas une option.
Vous pourriez modifier le code ci-dessus pour utiliser
memory_get_usage
d'une manière qui va vous donner une estimation différente de la mémoire dans une variable, pas sûr que ce soit le meilleur ou le pire.Memprof est une extension php qui permet de trouver ceux de la mémoire-les mangeurs de fragments, spécialement orientée objet des codes.
Ce tutoriel adapté est tout à fait utile.
Note: j'ai essayé, sans succès, de compiler cette extension pour windows. Si vous essayez donc, assurez-vous que votre php n'est pas thread-safe. Pour éviter quelques maux de tête, je vous suggère de l'utiliser sous *nix environnements.
Un autre lien intéressant a été un slideshare décrivant comment php gère la mémoire. Il vous donne quelques indices au sujet de votre script, l'utilisation de la mémoire.
Je me demande est peut-être votre pensée en ce qui concerne la méthodologie est erronée ici.
La base de la réponse à votre question - comment puis-je savoir où cette erreur se produit? - a déjà été répondu; vous savez quelle est la cause de cela.
Cependant, ce est un de ces cas où le déclenchement d'erreur n'est pas vraiment le problème, bien sûr, que 232 octets de l'objet n'est pas votre problème à tous. C'est le+de 20 Mégas qui a été attribuée avant elle.
Il y a eu quelques idées validées qui peuvent vous aider à suivre que vous avez vraiment besoin de regarder "niveau supérieur" ici, à l'architecture de l'application, et pas seulement à des fonctions individuelles.
Il se peut que votre application nécessite plus de mémoire pour faire ce qu'il fait, à la charge de l'utilisateur que vous avez. Ou peut-être il ya des vrais porcs de la mémoire qui sont inutiles - mais vous devez savoir ce qui est nécessaire ou pas de répondre à cette question.
Que, fondamentalement signifie aller ligne par ligne, de l'objet-par-objet, la création de profils que nécessaire, jusqu'à ce que vous trouver ce que vous cherchez; une grande mémoire des utilisateurs. Notez qu'il n'y a pas un ou deux grands éléments... si seulement c'était si facile! Une fois que vous trouvez la mémoire des porcs, alors à vous de déterminer si elles peuvent être optimisés. Si non, alors vous avez besoin de plus de mémoire.
Consultez la documentation de la fonction la fonction memory_get_usage() pour afficher l'utilisation de la mémoire au moment de l'exécution.
Site "SI !1 0" fournit une utilisation simple MemoryUsageInformation classe. Il est très utile pour le débogage des fuites de mémoire.
Utilisation xdebug le profil d'utilisation de la mémoire.