Précédent   Forum des professionnels en informatique > PHP > Langage > Syntaxe
Syntaxe Forum d'entraide sur la syntaxe de PHP et la POO. Avant de poster -> FAQ syntaxe, Cours d'initiation et cours de POO
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 18/12/2007, 11h21   #1
Rédacteur/Modérateur

 
Avatar de arnolem
 
Inscription : février 2005
Messages : 2 798
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : février 2005
Messages : 2 798
Points : 2 673
Points : 2 673
Par défaut [POO] Fuite de mémoire de PHP 5

Bonjour, je me suis heurté à un gros problème de performance sur PHP.

Je travail sur des quantités énormes d'information contenu dans des objets. Tout semble optimisé, pas de copie mais des références, pas de superflus. Bref je ne pense pas pouvoir faire mieux mais malgrès ça, j'attend la memory_limit.

Je pourrais augmenter la limite mais je voudrais comprendre et essayer de corriger avant tout. Pour cela, j'ai simplifié mon script au maximum.

Voici à quoi j'arrive :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php
class Test
{
    private $_var ;
 
    public function __construct()
    {
        echo "NEW\n" ;
        $this->_var = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
                . 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
                . 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
                . 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
                . 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
                . 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
                . 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
                . 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' ;
    }
    public function __destruct()
    {
        echo "DESTROY\n" ;
        $this->_var = null ;
    }
}
 
echo memory_get_usage() . "\n" ;
$toto = new Test() ;
echo memory_get_usage() . "\n" ;
unset($toto) ;
echo memory_get_usage() . "\n" ;
?>
J'obtiens :

Citation:
55208
NEW
56752
DESTROY
56336
On peut voir que malgrès la destruction de l'objet, on a 1 Ko de de consommé pour rien.

Le pire c'est que je perd ce Ko à chaque instanciation.
Avec des centaines d'instanciation, ça explose.

Avez vous une explication ou des idées pour améliorer ?

Merci
arnolem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2007, 12h33   #2
Membre éclairé
 
Homme Yann
Développeur Web
Inscription : avril 2005
Messages : 280
Détails du profil
Informations personnelles :
Nom : Homme Yann
Âge : 27
Localisation : France, Ille et Vilaine (Bretagne)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : avril 2005
Messages : 280
Points : 366
Points : 366
Envoyer un message via MSN à yannux
et si tu utilisqez unset() plutot ?
yannux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2007, 15h06   #3
Rédacteur/Modérateur

 
Avatar de arnolem
 
Inscription : février 2005
Messages : 2 798
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : février 2005
Messages : 2 798
Points : 2 673
Points : 2 673
en fait, même sans la fonction __destroy, il y a cette perte de mémoire.

En fait, cette perte de mémoire n'est pas la seule piste. Je suis sur autre chose, je vous tiens au courant.

Merci
arnolem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2007, 15h27   #4
Membre éclairé
 
Homme Yann
Développeur Web
Inscription : avril 2005
Messages : 280
Détails du profil
Informations personnelles :
Nom : Homme Yann
Âge : 27
Localisation : France, Ille et Vilaine (Bretagne)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : avril 2005
Messages : 280
Points : 366
Points : 366
Envoyer un message via MSN à yannux
Ca me dit pas si t'as testé unset()
yannux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2007, 16h18   #5
Rédacteur/Modérateur

 
Avatar de arnolem
 
Inscription : février 2005
Messages : 2 798
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : février 2005
Messages : 2 798
Points : 2 673
Points : 2 673
Le problème vient justement de unset()

En fait, en allant plus loin dans mon code, je me suis rendu compte que un unset sur un objet passé en référence ne détruisait que la référence et non l'objet.

C'est ça le problème.

Merci pour ceux qui ont cherché
arnolem est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h31.


 
 
 
 
Partenaires

Hébergement Web