Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & Oracle
PHP & Oracle Forum d'entraide sur Oracle avec PHP. Avant de poster -> FAQ Oracle et Cours Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/12/2006, 13h45   #1
Membre habitué
 
Avatar de a028762
 
Inscription : décembre 2003
Messages : 222
Détails du profil
Informations forums :
Inscription : décembre 2003
Messages : 222
Points : 108
Points : 108
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 :
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; 
} 
....
a028762 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2006, 15h32   #2
Membre confirmé
 
Inscription : janvier 2004
Messages : 242
Détails du profil
Informations forums :
Inscription : janvier 2004
Messages : 242
Points : 245
Points : 245
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.
chaced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2006, 15h44   #3
Membre Expert
 
Avatar de Lorenzo77
 
Inscription : mai 2006
Messages : 1 294
Détails du profil
Informations personnelles :
Âge : 40
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : mai 2006
Messages : 1 294
Points : 1 220
Points : 1 220
ou tu dois utiliser le destructeur de ta classe ... ce que je trouve + propre .
Lorenzo77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2006, 16h41   #4
Membre habitué
 
Avatar de a028762
 
Inscription : décembre 2003
Messages : 222
Détails du profil
Informations forums :
Inscription : décembre 2003
Messages : 222
Points : 108
Points : 108
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
a028762 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2006, 18h22   #5
Membre habitué
 
Avatar de a028762
 
Inscription : décembre 2003
Messages : 222
Détails du profil
Informations forums :
Inscription : décembre 2003
Messages : 222
Points : 108
Points : 108
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 :
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 ...
a028762 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2006, 19h04   #6
Membre Expert
 
Avatar de Lorenzo77
 
Inscription : mai 2006
Messages : 1 294
Détails du profil
Informations personnelles :
Âge : 40
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : mai 2006
Messages : 1 294
Points : 1 220
Points : 1 220
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
Lorenzo77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2006, 20h48   #7
Membre habitué
 
Avatar de a028762
 
Inscription : décembre 2003
Messages : 222
Détails du profil
Informations forums :
Inscription : décembre 2003
Messages : 222
Points : 108
Points : 108
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é !
a028762 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h55.


 
 
 
 
Partenaires

Hébergement Web