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
5 Réponses :
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. P> et qu'en est-il des appels de fonction dans le cycle? PHP libérera toutes les allocations de ces fonctions? (Après appel) code> p>
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)
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:
Cette confusion peut principalement être attribuée à la fausse hypothèse que isset code> 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 code>. Par exemple,
isset ($ foo) code> et
isset ($ bar) code> serait tous les deux de faux dans l'exemple ci-dessus.
De plus, j'éviterais de mettre la fermeture ?> Code> délimiter dans des blocs de code sur donc. Rend le code inutilement ( légèrement b>) 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/...
nonset () ne fait que cela, il désigne une variable; Mais ce n'est pas immédiat de mémoire libre. P>
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. P>
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. P>
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 code> 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).
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. P>
Peut-être voir aussi les commentaires sur le manuel PHP: Manuel non défini < / a> p>
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. p>
J'ai trouvé problème. P>
Tout d'abord, il a été causé par Xdebug fort> Profity Tools (j'ai tout activé :)) - et cela consommer beaucoup de mémoire. P>
N'oubliez donc que: xdebug (lorsque le profil allumé) consomme une mémoire dans le processus PHP de votre application p>
Deuxièmement, je n'ai pas publié Membres statiques Strong> utilisé dans les fonctions appelées. p>
Mais cela ne répond pas à votre question. Quoi de mieux en termes de mémoire, non défini ou défini sur NULL
À 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.