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

PHP & Base de données Discussion :

Apache me remplit la mémoire !


Sujet :

PHP & Base de données

  1. #1
    Membre éclairé Avatar de a028762
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 419
    Par défaut Apache me remplit la mémoire !
    J'ai un script qui utilise un objet dans lequel j'ai encapsulé des accès Mysql (genre PDO mais perso)
    je charge une table Oracle via ODBC (là , ce n'est pas encapsulé) puis
    crée une occurence d'un objet que je cree chaque fois que j'ai une ligne à créer (ou à modifier mais l'objet se débrouille)..
    Et là, je vois la mémoire d'un des deux process Apache augmenter jusqu'à des valeurs extrêmes (500Mo) sans que je comprenne ce qui se passe !
    Et en fin de boucle, j'ai beau ajouter un unset de l'occurence créee, cela ne change rien ....
    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
     
    function AjoutPiece($reference,$Indice,$Designation) { 
        $UnePiece = new Piece($Reference); 
        if ($UnePiece->Erreur <> "") { 
            $Message .= $UnePiece->Erreur."<br>"; 
        } else { 
            $UnePiece->Enregistrer(); 
            if ($UnePiece->Erreur <> "") { 
                $Message .= $UnePiece->Erreur."<br>"; 
            } else { 
                $UnePiece->Attribuer("Indice",$Indice); 
                if ($UnePiece->Erreur <> "") $Message .= $UnePiece->Erreur."<br>"; 
                $UnePiece->Attribuer("Designation",$Designation); 
                if ($UnePiece->Erreur <> "") $Message .= $UnePiece->Erreur."<br>"; 
            } 
        } 
        unset($UnePiece); 
    } 
    .... 
    while (odbc_fetch_into($Prepare,$Lignes)) { 
        $Reference        = $Lignes[0]; 
        $Indice            = $Lignes[1]; 
        $Designation    = $Lignes[2]; 
        $Message        = AjoutPiece($Reference,$Indice,$Designation); 
        if ($Message <> "") { 
            fputs ($Canal,$Message."\n"); 
        } 
        $Compteur = $Compteur + 1; 
    } 
    ....

  2. #2
    Membre expérimenté
    Inscrit en
    Janvier 2004
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 242
    Par défaut
    Tu fais un unset sur un object, sauf qu'un unset ça désaloue juste le pointeur, donc en fait, tu rends disponible ta variable, et l'objet reste en mémoire.

    Mais normalement tout les objets sont détruits en quittant le script.

    Donc réutilise le même object du début a la fin sans en créer un nouveau a chaque passage.

  3. #3
    Membre Expert Avatar de Lorenzo77
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    1 472
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 472
    Par défaut
    ou tu dois utiliser le destructeur de ta classe ... ce que je trouve + propre .

  4. #4
    Membre éclairé Avatar de a028762
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 419
    Par défaut
    Moi aussi, je trouve un __destruct plus propre ...
    mais j'osais pas ! ou plutot je pensais qu'un unset faisait la même chose
    Je vais essayer cela ...
    Merci d'avance

  5. #5
    Membre éclairé Avatar de a028762
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 419
    Par défaut Oui, c'est pas gagné !
    1- J'ajoute un __destruct comme indiqué :
    erreur car mon objet n'a pas de destructeur explicite
    2- Création d'un destructeur vide ....
    Rien ne change par rapport à la croissance mémoire et finalement je viens me planter sur une erreur encore plus bizarre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Catchable fatal error : Object of class Piece could not be converted 
    to string in C :\Documents and Settings\pouet pouet\piece.class.php on line 81
    ou la ligne 81 n'a strictement pas de rapport avec la question
    3 - Autre solution suggérée, Ben, mon objet, persistant je le rappelle,
    s'identifie par ses attributs à la création.
    Donc il ne peut être utilisé dans la boucle facilement ...
    C'est pas évident ...

  6. #6
    Membre Expert Avatar de Lorenzo77
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    1 472
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 472
    Par défaut
    tu pourrais envoyer le script php et indiquer ta version exact de PHP pour que je fasse des tests ?

    vu la gueule de l'erreur :
    -tu dois utiliser un systeme perso de gestion des exceptions qui rentre en conflit avec
    -ou le code dans le destructeur fait une chose qu'il ne doit pas faire ... si le destructeur est vide c'est encore + étrange

  7. #7
    Membre éclairé Avatar de a028762
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 419
    Par défaut Difficile de comprendre ce qui se passe
    J'utilise le script d'import initial de classe initiale (dans le post initial),
    qui appelle une classe nommée Piece
    cette Pièce est abstraite d'une classe nommée Conception qui contient tous les controles spécifiques au module (regroupement fonctionnel)
    cette même classe fait appel à une autre classe astraite nommmé Persistante qui est donc mon PDO perso.
    En fait, cette classe contient l'ensemble des méthodes qui accèdent à une table Mysql , table dont les champs sont les attributs de la classe Pièce...
    Je vais réécrire un truc du même genre (mais plus court) pour le soumettre à votre sagacité ...
    Mais il faut compter le week-end, car la semaine, je bosse pour mon employeur
    Ah, l'erreur relevée dans un post précédent n'a rien à voir, ça a planté car un tableau était vide dans un cas .
    Une fois cette erreur corrigée, cela continue de monter en mémoire ..... 700Mo à ce jour ...
    difficile de trouver un jeu d'essai qui va plus loin ...
    mais il ne faut pas être pressé !

Discussions similaires

  1. Réponses: 2
    Dernier message: 01/06/2010, 09h55
  2. Process Apache qui utilise trop de mémoire
    Par charline_irlande dans le forum Apache
    Réponses: 2
    Dernier message: 26/10/2009, 17h29
  3. Limite Apache en mémoire ?
    Par a028762 dans le forum Apache
    Réponses: 3
    Dernier message: 22/09/2009, 13h26
  4. [Apache] très gourmand en mémoire ?
    Par Invité dans le forum Apache
    Réponses: 2
    Dernier message: 23/06/2004, 09h02

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