OVH Cloud OVH Cloud

gestion de la memoire dans PHP 4

1 réponse
Avatar
emma.bagge
Bonjour,

Je travaille avec de gros objets possédant eux-mêmes des sous-objets
etc, et je souhaite pouvoir libérer la mémoire utilisée par chacun lors
de traitements de masse.

J'ai donc créé des méthodes de destruction de mes objets consistant en
des unset des attributs de mon objet. Malheureusement, ça ne marche pas
du tout, la mémoire utilisée étant même parfois plus grosse après appel
de la méthode.
Apparemment unset ne libère pas la mémoire mais se contente de
positionner la variable à null, ce qui ne résoud pas mon problème d'un
trop grand nombre de variables, et même prend plus de mémoire dans
certains cas : $toto="xxx" utilise moins de mémoire que unset($toto).

J'ai aussi essayé en passant par des sous-méthodes, me disant qu'une
variable locale devrait être détruite après appel à la fonction mais ça
n'a pas l'air d'être le cas.

Quelqu'un aurait-il une idée ?
Merci d'avance

1 réponse

Avatar
ftc
Bonjour,

Je travaille avec de gros objets possédant eux-mêmes des sous-objets
etc, et je souhaite pouvoir libérer la mémoire utilisée par chacun lors
de traitements de masse.

J'ai donc créé des méthodes de destruction de mes objets consistant en
des unset des attributs de mon objet. Malheureusement, ça ne marche pas
du tout, la mémoire utilisée étant même parfois plus grosse après appel
de la méthode.
Apparemment unset ne libère pas la mémoire mais se contente de
positionner la variable à null, ce qui ne résoud pas mon problème d'un
trop grand nombre de variables, et même prend plus de mémoire dans
certains cas : $toto="xxx" utilise moins de mémoire que unset($toto).


unset ne fait qu'indiquer à PHP qu'il n'y a plus de référence sur la
variable, ensuite c'est PHP qui décide ou non de libérer la mémoire avec
le garbage collector.

Tu indiques que tu utilise des méthodes de destruction consistant en des
unset sur les attributs, un simple unset sur l'objet doit normalement
suffir.

Attention si tu utilises &, il faut vérifier qu'après le unset il n'y a
plus aucun pointeur sur la variable. Idem pour les varables globales qui
ne peuvent pas être détruite à l'intérieur d'une fonction ou d'une
méthode à moins de faire un appel du genre : unset( $GLOBALS['mavar'] )

On ne peut pas en dire beaucoup plus sans avoir un bout de code.


Quand on est face à ce genre de problématique, on réutilise généralement
les objets déjà créés plutôt que d'en créer de nouveaux et de détruire
les anciens.