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 :

Construct / destruct et liberation mémoire pour debutant [POO]


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Aucune
    Inscrit en
    Juillet 2019
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Aucune

    Informations forums :
    Inscription : Juillet 2019
    Messages : 49
    Points : 41
    Points
    41
    Par défaut Construct / destruct et liberation mémoire pour debutant
    Bonjour

    Ceci est mon premier post car je suis débutant... à bientôt 50 ans.
    Je poste ici car même si le fond est PDO, le problème est bien la destruction d'un objet et pas l usage de PDO.

    Pour comprendre ma demande je précise que j ai été initié à l informatique en 1984, au Pascal sur un TO7. On libérait systématiquement la mémoire , la POO n existait pas.

    1/ J ai lu que PHP gérait seul sa mémoire. Je me suis dit super toujours ça de moins à gérér mais j au fait des tests en faisant de très réguliers echo memory_get_usage() et je m aperçois que faire des unset() libere bien d avantage de mémoire.

    2/ Je découvre aussi PDO. Donc j utilise une class toute faite, bien commentée et simple d utilisation que j ai trouvé ici https://github.com/wickyaswal/php-my...database-class (elle n est plus maintenue mais tellement simple à utiliser, si vous pouvez m en conseiller une autre bien commentée je suis preneur )

    Mon pb :
    Je crée mon objet PDO et le détruit. Je teste la mémoire utilisée avant et après la création et après la destruction. Cette dernière est supérieure à la mémoire initiale alors que selon toute logique elle devrait être égale.

    je regarde le code de la class PDO:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public function __construct() {
    		$this->log = new Log();
    		$this->Connect();
    		$this->parameters = array();
    	}
    je regarde le code de la class log :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public function __construct() {
        date_default_timezone_set('Europe/Amsterdam');	
        $this->path  = dirname(__FILE__)  . $this->path;	
    	}
    Ma question (enfin) : Comment détruire proprement l'instance de PDO crée qui détruirait aussi l'instance Log crée afin de libérer l intégralité de la mémoire utilisée ?

    Merci pour votre aide.

  2. #2
    Membre chevronné

    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2013
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : développeur

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 576
    Points : 1 989
    Points
    1 989
    Par défaut
    Salut,

    Très bonne question. https://www.php.net/manual/fr/language.oop5.decon.php
    Tu peux utiliser unset ou affecter à null ce qui va call la méthode __destruct de l'objet, de la doc
    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
    31
    32
    33
     
    class Foo {
     
        /**
         * An indentifier
         * @var string
         */
        private $name;
        /**
         * A reference to another Foo object
         * @var Foo
         */
        private $link;
     
        public function __construct($name) {
            $this->name = $name;
        }
     
        public function setLink(Foo $link){
            $this->link = $link;
        }
     
        public function __destruct() {
            echo 'Destroying: ', $this->name, PHP_EOL;
        }
    }
    $foo = new Foo('test');
    // appelle la méthode destruct
    $foo = null;
     
    $foo = new Foo('test');
    // appelle la méthode destruct
    unset($foo);
    M'est dès qu'il y a le rendu de la page les objets sont détruits par le garbage normalement.

  3. #3
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 381
    Points : 5 732
    Points
    5 732
    Billets dans le blog
    1
    Par défaut
    Ci-joint une autre classe : https://github.com/AxelPariss/DB (je viens de la découvrir et pas encore utilisée)
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  4. #4
    Membre du Club
    Homme Profil pro
    Aucune
    Inscrit en
    Juillet 2019
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Aucune

    Informations forums :
    Inscription : Juillet 2019
    Messages : 49
    Points : 41
    Points
    41
    Par défaut
    @laurentSc J avais essayé et ça fonctionne tres bien seulement je rencontrais des problemes avec UPDATE / bind

    kevin254kl Merci d avoir pris le temps de me répondre.
    J'utilise systématiquement le unset().
    Avec ce code suivant je devrais donc obtenir 2 valeurs identiques alors qu elles sont différentes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    require "init/Db.class.php";
    echo memory_get_usage() . '<br/>';
    $db = new Db();
    unset($db);
    echo memory_get_usage() . '<br/>';
    En effet, dans le constructeur DB il est crée une nouvelle instance de Log

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public function __construct() {
    		$this->log = new Log();
    		$this->Connect();
    		$this->parameters = array();
    	}
    Si je supprime cette ligne ($this->log = new Log() j ai bien les 2 mêmes valeurs donc je me dis qu'il devrait y avoir un destructeur de DB qui détruirait l instance de Log mais je n ai aucune idée de comment y parvenir.
    Comme je débute j essaie d explorer toutes les pistes mais tout assimiler en même temps m est difficile.

    merci de ton aide

  5. #5
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    si je peux me permettre ; comme tu débutes, je te conseillerai très fortement de laisser tomber les problèmes de gestion et d'optimisation de la mémoire et de te concentrer uniquement sur l'acquisition des concepts web et fonctionnalités du langage.
    Je te garantis que cela devrait meubler tes journées pendant de longues semaines tant le champ de connaissances et de savoirs à appréhender est vaste.
    Ne t'encombre pas l'esprit avec des problématiques très pointues que tu n'auras probablement jamais à gérer ou du moins pas avant longtemps
    PHP est très performant et depuis la version 7 bien optimisé, donc continue ton apprentissage mais ne perd pas ton temps.

    Bienvenu dans la communauté

  6. #6
    Membre du Club
    Homme Profil pro
    Aucune
    Inscrit en
    Juillet 2019
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Aucune

    Informations forums :
    Inscription : Juillet 2019
    Messages : 49
    Points : 41
    Points
    41
    Par défaut
    Merci pour ce conseil avisé car est vrai.... cela risque d occuper une bonne partie de mon temps .

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

Discussions similaires

  1. Problème pour debuter avec glut
    Par ismael14 dans le forum GLUT
    Réponses: 2
    Dernier message: 26/07/2004, 10h37
  2. [sql] update pour debutant
    Par zebulix13 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 11/06/2004, 15h45
  3. [langage] Renseignement pour débuter sur perl
    Par freeshman dans le forum Langage
    Réponses: 2
    Dernier message: 29/04/2004, 23h47
  4. Economie de mémoire pour plusieur images avec la même source
    Par neness dans le forum Composants VCL
    Réponses: 5
    Dernier message: 18/01/2004, 10h56

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