IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[POO] Fuite de mémoire de PHP 5


Sujet :

Langage PHP

  1. #1
    Rédacteur

    Avatar de arnolem
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 856
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 856
    Points : 6 114
    Points
    6 114
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 :

    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

  2. #2
    Membre averti
    Homme Profil pro
    Lead Dev Web
    Inscrit en
    Avril 2005
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Lead Dev Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2005
    Messages : 282
    Points : 390
    Points
    390
    Par défaut
    et si tu utilisqez unset() plutot ?

  3. #3
    Rédacteur

    Avatar de arnolem
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 856
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 856
    Points : 6 114
    Points
    6 114
    Par défaut
    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

  4. #4
    Membre averti
    Homme Profil pro
    Lead Dev Web
    Inscrit en
    Avril 2005
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Lead Dev Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2005
    Messages : 282
    Points : 390
    Points
    390
    Par défaut
    Ca me dit pas si t'as testé unset()

  5. #5
    Rédacteur

    Avatar de arnolem
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 856
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 856
    Points : 6 114
    Points
    6 114
    Par défaut
    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é

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Fuite de mémoire en POO avec PHP 5.2
    Par aphax dans le forum PHP & Base de données
    Réponses: 0
    Dernier message: 23/06/2011, 15h33
  2. Réponses: 3
    Dernier message: 06/11/2005, 19h02
  3. fuite de mémoire
    Par mamag dans le forum MFC
    Réponses: 17
    Dernier message: 19/08/2005, 11h42
  4. Fuite de mémoire en utilisant le template list
    Par schtroumpf_farceur dans le forum Langage
    Réponses: 9
    Dernier message: 18/07/2005, 21h44
  5. Réponses: 8
    Dernier message: 17/10/2002, 13h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo