Apache me bouffe la mémoire !!

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Apache me bouffe la mémoire !!

Merci pour les conseils de code ...

par lemoineo » 05 déc. 2006, 19:33

Merci pour les conseils sur le code.
- Ceci n'est qu'un extrait et effectivement lors du copier/coller, j'ai perdu le return $Message mais je te rassure , il existe bel et bien
- Par contre, sur le new et le unset, remarque fort pertinente sur la portée de l'objet, mais bien pas d'effet constaté sur l'ajout d'un unset que je n'avais pas mis au début.
- Bon, sur la question de montée progressive de ce code jusqu'à 500 Mo (environ) ... pas d'idée ?
Pour info, le SQL ramené par ODBC ramène entre 2000 et 8000 lignes et
lancé seul, répond dans la seconde suivante sans rien consommer de plus qu'une page html basique ...
Par contre, c'est bien l'empilage d'occurences (2000 à 8000) qui fait monter la charge mémoire du process apache mais toujours pas de piste...
Je vais saucisonner le problème jusqu'à ce que je comprenne

par Ajoloca » 05 déc. 2006, 02:07

Bonsoir,

Déjà une petite remarque
Ici
$Message = AjoutPiece($Reference,$Indice,$Designation);
Tu assignes à $Message le retour d'une fonction, mais la fonction en question ne retourne rien.

Le unset() ne sert à rien, ton objet est local, donc des que tu quittes la fonction il ne reste aucune référence à l'objet.
Il sera détruit par PHP (garbage collector).
Cette partie tu peux la racourcir
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;
} 
Elle deviendrait
while (odbc_fetch_into($Prepare,$Lignes)) {
    $Message        = AjoutPiece($Lignes[0],$Lignes[1], $Lignes[2]);
        fputs ($Canal,$Message."\n");
    }
    $Compteur = $Compteur + 1;
} 
EDIT :
Tu n'as pas de message d'erreur PHP ?

Dans ta fonction tu concatènes une variable qui n'a pas été defnie ni déclarée conne global, $Message

certes !

par lemoineo » 05 déc. 2006, 01:58

Un extrait du code
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;
}
....
L'objet persistant (non détaillé ici) vers la base SQL est donc $UnePiece dans la fonction AjoutPiece

Si cela peut donner quelqu'indication

Re: Apache me bouffe la mémoire !!

par Cyrano » 04 déc. 2006, 21:54

...Et en fin de boucle....
Quel genre de boucle ? Le problème est peut-être là :-k

Apache me bouffe la mémoire !!

par lemoineo » 04 déc. 2006, 21:31

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 ....