12
votes

Quelle est la meilleure méthode pour le nettoyage de la mémoire dans PHP? (5.2)

J'ai deux questions simples. Ce qui est meilleur / utile pour le nettoyage de la mémoire.

Fatal error: Allowed memory size of 419430400 bytes exhausted


1 commentaires

À quoi ressemble votre code, qui produit l'erreur? Peut-être qu'une des fonctions est de la mémoire intensive. Je l'avais par exemple lorsque vous travaillez avec la bibliothèque GD.


5 Réponses :


0
votes

et qu'en est-il des appels de fonction dans le cycle? PHP libérera toutes les allocations de ces fonctions? (Après appel)

Une fois que l'exécution quitte la portée d'une fonction, toutes les variables non statiques sont retirées de la mémoire.


3 commentaires

Merci, mais la question est quand? Immédiatement après appel?


Je vous demande parce que je sais que php est stupide dans cette zone. Dans d'autres langues, cela est une matière bien sûr.


Dès que possible. Je ne veux pas dire «immédiatement» parce que cela pourrait ne pas être exactement vrai (surtout si nous traitons des ressources)



4
votes

PHP lui-même confond les deux concepts parfois mais, en général, une variable définie sur NULL n'est pas la même qu'une variable qui n'existe pas: xxx


3 commentaires

Cette confusion peut principalement être attribuée à la fausse hypothèse que isset est la contrepartie de non définie. Désanguliste supprime un symbole variable de la portée actuelle, où étant émetteur vérifie également s'il existe et non- null . Par exemple, isset ($ foo) et isset ($ bar) serait tous les deux de faux dans l'exemple ci-dessus.


De plus, j'éviterais de mettre la fermeture ?> délimiter dans des blocs de code sur donc. Rend le code inutilement ( légèrement ) plus difficile à lire.


En dehors de cette confusion, il est effectivement très difficile de distinguer entre NULL et UNET. Sérieusement: Stackoverflow.com/Questtions/2283647/...



2
votes

nonset () ne fait que cela, il désigne une variable; Mais ce n'est pas immédiat de mémoire libre.

Le collecteur des ordures de PHP libérera en réalité une mémoire préalablement utilisée par des variables qui sont maintenant non définies, mais uniquement lorsqu'elle s'exécute. Cela pourrait être plus tôt, lorsque les cycles de la CPU ne sont pas utilisés activement pour d'autres travaux, ou avant que le script ne soit pas manqué de mémoire ... Quelle que soit la situation qui se produit d'abord.

et soyez conscient que non défini ne libère pas nécessairement la mémoire utilisée par une variable si vous avez d'autres références à cette variable. Il suffira simplement de supprimer la référence et de réduire le nombre de références pour les données stockées réelles de 1.

Modifier Tandis que non définit ne relâche pas immédiatement la mémoire utilisée (seule la collection de la poubelle ne le fait réellement) La mémoire qui n'est plus utilisée en conséquence est disponible pour la déclaration de nouvelles variables


4 commentaires

Merci, mais quand il sera libéré? J'ai attaché mon extrait de code. Quand je cours, ça commence, après 5 minutes, je reçois une erreur fatale 400 Mo épuisée ..


Tout cela est faux. nonset libère la mémoire dans le même sens que le collecteur des ordures (que BTW n'existe que depuis PHP 5.3), c'est-à-dire qu'ils renvoient les blocs à l'allocateur de mémoire si le stockage sous-jacent de la variable n'a pas de plus de références.


nonset () rend la mémoire utilisée par la variable disponible pour la réutilisation (en décrémentant le zval refcount), mais ne le distribue pas. Le moteur Zend sait que le bloc de mémoire est disponible pour la réutilisation lorsque le refCount Zval est égal à zéro. La collection de la poubelle traçait réellement la mémoire, faisant efficacement un appel gratuit (). Au moins c'était ma compréhension. Bien que j'avoue que la compréhension est basée sur une myriade de sources contradictoires


vous avez raison. Le seul changement qu'ils ont fait dans PHP 5.3 était que le collecteur des ordures désormais (probablement) peut gérer des références circulaires (ce qui ne fonctionne pas dans PHP 5.2 ou plus bas, vous pourriez donc être à court de mémoire, car les objets n'ont jamais été libérés si vous aviez réellement libéré si vous aviez réellement libéré. références circulaires).



1
votes

Si vous non définissez la variable, il est simplement marqué, donc sur la prochaine collection à la poubelle, il sera supprimé. Si vous définissez sur NULL, les données de la variable sont écrasées.

Peut-être voir aussi les commentaires sur le manuel PHP: Manuel non défini < / a>

Au moins ce comportement est aussi ce que j'ai rencontré jusqu'à présent. Mais pour le réparer, vous devriez d'abord essayer de découvrir ce qui provoque la croissance de la mémoire. Le Memory_get_Usage fonction doit être utile pour cela.


0 commentaires

2
votes

J'ai trouvé problème.

Tout d'abord, il a été causé par Xdebug Profity Tools (j'ai tout activé :)) - et cela consommer beaucoup de mémoire.

N'oubliez donc que: xdebug (lorsque le profil allumé) consomme une mémoire dans le processus PHP de votre application

Deuxièmement, je n'ai pas publié Membres statiques utilisé dans les fonctions appelées.


1 commentaires

Mais cela ne répond pas à votre question. Quoi de mieux en termes de mémoire, non défini ou défini sur NULL