Apache me bouffe la mémoire !!

Eléphant du PHP | 70 Messages

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

Mammouth du PHP | 19672 Messages

04 déc. 2006, 21:54

...Et en fin de boucle....
Quel genre de boucle ? Le problème est peut-être là :-k
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 70 Messages

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

ViPHP
ViPHP | 1961 Messages

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
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Eléphant du PHP | 70 Messages

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