Il a été mentionné dans la page du manuel non défini en 2009 :
unset()
fait exactement ce que son nom dit - désinstaller une variable. Il ne force pas la libération immédiate de la mémoire. Le garbage collector de PHP le fera quand bon lui semblera - par intention dès que ces cycles de CPU ne sont pas nécessaires de toute façon, ou aussi tard qu'avant, le script manquerait de mémoire, quoi qu'il arrive en premier.
Si vous le faites, $whatever = null;
vous réécrivez les données des variables. Vous pouvez obtenir de la mémoire libérée / rétrécie plus rapidement, mais cela peut voler les cycles du processeur du code qui en a vraiment besoin plus tôt, ce qui entraîne un temps d'exécution global plus long.
(Depuis 2013, cette unset
page de manuel n'inclut plus cette section)
Notez que jusqu'à php5.3, si vous avez deux objets en référence circulaire , comme dans une relation parent-enfant, appeler unset () sur l'objet parent ne libérera pas la mémoire utilisée pour la référence parent dans l'objet enfant. (La mémoire ne sera pas non plus libérée lorsque l'objet parent est récupéré.) ( Bogue 33595 )
La question " différence entre unset et = null " détaille quelques différences:
unset($a)
supprime également $a
de la table des symboles; par exemple:
$a = str_repeat('hello world ', 100);
unset($a);
var_dump($a);
Les sorties:
Notice: Undefined variable: a in xxx
NULL
Mais quand $a = null
est-il utilisé:
$a = str_repeat('hello world ', 100);
$a = null;
var_dump($a);
Outputs:
NULL
Il semble que $a = null
c'est un peu plus rapide que son unset()
homologue: la mise à jour d'une entrée de table de symboles semble être plus rapide que sa suppression.
- lorsque vous essayez d'utiliser un élément inexistant (
unset
variable ), une erreur sera déclenchée et la valeur de l'expression de variable sera nulle. (Parce que, quoi d'autre PHP devrait-il faire? Chaque expression doit donner une certaine valeur.)
- Une variable avec null lui est cependant toujours une variable parfaitement normale.
$whatever
pointe vers un objet,$whatever = null
remplace le pointeur, pas l'objet lui-même, il agit donc de la même manière queunset()
.unset
n'est pas en fait une fonction, mais une construction de langage . Ce n'est pas plus un appel de fonction qu'unreturn
ou uninclude
.Mis à part les problèmes de performances, l'utilisation
unset
rend l' intention de votre code beaucoup plus claire.la source
unset
commeUnSeT
, par exemple. La communauté a opté pour le tout en minuscule par style, mais d'autres boîtiers fonctionnent toujours.En faisant unset () sur une variable, vous avez essentiellement marqué la variable pour `` garbage collection '' (PHP n'en a pas vraiment, mais par exemple), donc la mémoire n'est pas immédiatement disponible. La variable ne contient plus les données, mais la pile reste à la plus grande taille. Faire la méthode null supprime les données et réduit la mémoire de la pile presque immédiatement.
Cela vient de l'expérience personnelle et d'autres. Voir les commentaires de la fonction unset () ici .
Personnellement, j'utilise unset () entre les itérations dans une boucle afin que je n'aie pas à avoir le retard de la taille de la pile en yo-yo. Les données ont disparu, mais l'empreinte demeure. À la prochaine itération, la mémoire est déjà prise par php et donc, plus rapide pour initialiser la variable suivante.
la source
Par cela, il semble que "= null" est plus rapide.
Résultats PHP 5.4:
Résultats PHP 5.3:
Résultats PHP 5.2:
Résultats PHP 5.1:
Les choses commencent à être différentes avec PHP 5.0 et 4.4.
5.0:
4.4:
Gardez à l'esprit que microtime (true) ne fonctionne pas en PHP 4.4, j'ai donc dû utiliser l'exemple microtime_float donné dans php.net/microtime / Example # 1.
la source
unset
c'est plus rapide. J'ai un test qui vérifie plus tard l'existence de l'unset
affaire. Dans ce test, ilnull
est légèrement plus rapide. Test: pastebin.com/fUe57C51gc_collect_cycles
avant de démarrer la minuterie pour obtenir des résultats plus précis.Cela fait une différence avec les éléments du tableau.
Considérez cet exemple
Ici, le «test» clé existe toujours. Cependant, dans cet exemple
la clé n'existe plus.
la source
Il fonctionne de manière différente pour les variables copiées par référence:
la source
En ce qui concerne les objets, en particulier dans le scénario de chargement paresseux, il convient de considérer que le garbage collector s'exécute dans des cycles CPU inactifs, donc en supposant que vous rencontrez des problèmes lorsque beaucoup d'objets chargent une petite pénalité de temps résoudra la libération de mémoire.
Utilisez time_nanosleep pour permettre au GC de collecter de la mémoire. Il est souhaitable de définir la variable sur null.
Testé sur le serveur de production, le travail consommait à l'origine 50 Mo, puis a été interrompu. Après avoir utilisé le nanosommeil, 14 Mo étaient une consommation de mémoire constante.
Il faut dire que cela dépend du comportement du GC qui peut changer d'une version PHP à l'autre. Mais cela fonctionne bien sur PHP 5.3.
par exemple. cet exemple (code pris sous forme de flux google VirtueMart2)
la source
J'en doute encore, mais je l'ai essayé avec mon script et j'utilise xdebug pour savoir comment cela affectera l'utilisation de la mémoire de mon application. Le script est défini sur ma fonction comme ceci:
Et j'ajoute unset juste avant le
return
code et ça me donne: 160200 puis j'essaye de le changer avec$sql = NULL
et ça me donne: 160224 :)Mais il y a quelque chose d'unique sur ce comparatif quand je n'utilise pas unset () ou NULL, xdebug me donne 160144 comme utilisation de mémoire
Donc, je pense que donner la ligne pour utiliser unset () ou NULL ajoutera un processus à votre application et il sera préférable de conserver l'origine avec votre code et de diminuer la variable que vous utilisez aussi efficacement que possible.
Corrigez-moi si je me trompe, merci
la source
J'ai créé un nouveau test de performance pour
unset
et=null
, car comme mentionné dans les commentaires l'écrit ici a une erreur (la recréation des éléments). J'ai utilisé des tableaux, comme vous le voyez, cela n'avait plus d'importance maintenant.Mais je ne peux le tester que sur un serveur PHP 5.5.9, voici les résultats: - a pris 4.4571571350098 secondes - a pris 4.4425978660583 secondes
Je préfère
unset
pour des raisons de lisibilité.la source
PHP 7 est déjà travaillé sur ces problèmes de gestion de la mémoire et son utilisation réduite à minimale.
PHP 7.1 Outpu:
a pris 0,16778993606567 secondes a pris 0,16630101203918 secondes
la source
unset
le code s'il ne libère pas de mémoire immédiate est toujours très utile et serait une bonne pratique de le faire chaque fois que nous passons des étapes de code avant de quitter une méthode. prenez note qu'il ne s'agit pas de libérer de la mémoire immédiate. la mémoire immédiate est pour le CPU, qu'en est-il de la mémoire secondaire qui est la RAM.et cela aborde également la prévention des fuites de mémoire.
veuillez consulter ce lien http://www.hackingwithphp.com/18/1/11/be-wary-of-garbage-collection-part-2
j'utilise unset depuis longtemps maintenant.
une meilleure pratique comme celle-ci dans le code pour désinstaller instantanément toutes les variables qui ont déjà été utilisées comme tableau.
et
just unset($data);
pour libérer toute utilisation variable.veuillez consulter le sujet connexe pour désactiver
Quelle est l'importance de supprimer les variables en PHP?
[punaise]
la source
Pour mémoire, et en excluant le temps qu'il faut:
Il revient
Conclusion, à la fois la mémoire libre nulle et non définie comme prévu (pas seulement à la fin de l'exécution). De plus, la réaffectation d'une variable retient la valeur deux fois à un moment donné (520216 contre 438352)
la source