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 :

Problème mémoire sur appels fonction


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 82
    Par défaut Problème mémoire sur appels fonction
    Bonjour, j'ai un soucis que je n'arrive pas à corriger.

    J'ai une fonction qui me génère une partie d'un flux xml à partir d'une réponse de webservice.

    Cela fonctionne lorsque j'appelle ma fonction 3 ou 4 fois, mais dès que je veux appeler cette fonction 40, 50 ou 100x, j'ai de gros problème de mémoire.

    Qu'est-ce que je peux optimiser pour avoir un fonctionnement correct?

    Merci par avance pour vos réponses

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
     
    function genereArticle($filenameXml, $sousmenu_id)
    {
    	$i=1;
    	$fluxXml = simplexml_load_file ($filenameXml);
     
    	$fluxXml->registerXPathNamespace('blabla', 'http://dkhdkjhed/');
     
     
    	foreach ($fluxXml->Resultats->Resultat as $articles)
    	{
    		$img =  $articles->xxxxx->xxxxxxx->xxxxx;
     
    		if($sousmenu_id == '1111' || $sousmenu_id == '2222' || $sousmenu_id == '3333')
    		{
    			$periodeOuverture = $fluxXml->xpath("/xxx:xxxxx/xxxx:xxxxx/xxxx:xxxxx[".$i."]/xxx:xxxxxx/xxxx:xxxxxx[xxx:xxxxx= '16.02.49']/xxxx:xxxxxx");
    		}
     
    		$idArticle = $articles->dlijliud;
     
    		$codePostal = $articles->dsfdffds->efdsdf->sdfsdfsd;
     
    		$ville = $articles->dcscsdc->dkhkjds->dkuhkiuhsd;
     
    		$adresse = $articles->sdkhukj->dkhkjs.' '.$articles->sqkjhkjd->sdqjkhkjhsq.' '.$articles->sqdlihjkjsd->dsjhkjhsd;
     
    		$tel = $fluxXml->xpath("/xxx:xxxxx/xxxx:xxxxx/xxxx:xxxxx[".$i."]/xxx:xxxxxx/xxxx:xxxxxx[xxx:xxxxx= '16.02.49']/xxxx:xxxxxx");
     
    		$mail = $fluxXml->xpath("/xxx:xxxxx/xxxx:xxxxx/xxxx:xxxxx[".$i."]/xxx:xxxxxx/xxxx:xxxxxx[xxx:xxxxx= '16.02.49']/xxxx:xxxxxx");
     
    		$siteWeb = $fluxXml->xpath("/xxx:xxxxx/xxxx:xxxxx/xxxx:xxxxx[".$i."]/xxx:xxxxxx/xxxx:xxxxxx[xxx:xxxxx= '16.02.49']/xxxx:xxxxxx");
     
    		$descriptionCourt = $fluxXml->xpath("/xxx:xxxxx/xxxx:xxxxx/xxxx:xxxxx[".$i."]/xxx:xxxxxx/xxxx:xxxxxx[xxx:xxxxx= '16.02.49']/xxxx:xxxxxx");
     
    		$descriptionCom = $fluxXml->xpath("/xxx:xxxxx/xxxx:xxxxx/xxxx:xxxxx[".$i."]/xxx:xxxxxx/xxxx:xxxxxx[xxx:xxxxx= '16.02.49']/xxxx:xxxxxx");
     
    		$latitude = str_replace(',', '.', $articles->Geolocalisations->Latitude);
     
    		$longitude = str_replace(',', '.', $articles->Geolocalisations->Longitude);
     
    																					//'.$maj.'
    		$xml ='<ARTICLE priorite ="High" sousmenu_id="'.$sousmenu_id.'" maj="1">
    		<SAISON>
    		Toutes
    		</SAISON> 
    		<ADHERENT>1</ADHERENT> 
    		<TITRE>
     
    		<en>'.$titre.'</en>
    		<fr>'.$titre.'</fr>
    		</TITRE>
    		<ID>'.$idArticle.$sousmenu_id.'</ID>
    		<DESCRIPTION>
    		<en><![CDATA['.$periodeOuverture[0].'<br/> '.$descriptionCourt[0].'<br/> '.$descriptionCom[0].'<br/><br/> '.$adresse.'<br/> '.$codePostal.' '.$ville.'<br/> '.$mail[0].'<br/><br/> '.$tel[0].'<br/><br/> '.$siteWeb[0].']]>
     
    		</en>
    		<fr> <![CDATA['.$periodeOuverture[0].'<br/>  '.$descriptionCourt[0].'<br/> '.$descriptionCom[0].'<br/><br/> '.$adresse.'<br/> '.$codePostal.' '.$ville.'<br/> '.$mail[0].'<br/><br/> '.$tel[0].'<br/><br/> '.$siteWeb[0].']]>
     
    		</fr>
    		</DESCRIPTION>
    		<COMPTE_RENDU>
     
    		<en>.</en>
    		<fr>.</fr>
    		</COMPTE_RENDU>
    		<MOTS_CLEF>.</MOTS_CLEF>
    		<ICONE></ICONE>
    		<IMAGE></IMAGE>
    		<DEBUT>01/09/2010 10:00</DEBUT>
    		<FIN>01/09/2020 10:00</FIN>
    		<LATITUDE>'.$latitude.'</LATITUDE>
    		<LONGITUDE>'.$longitude.'</LONGITUDE>
    		<ADRESS></ADRESS>
    		<TEL></TEL>
    		<SITE></SITE>
    		</ARTICLE>';
     
    		$i++;
    	}
     
    	return $xml;
    }
     
    $xml .= genereArticle("http://dkjhkhkdsjhk/khdkjhkjd/ksdjhkjd", 714);
     
    $xml .= genereArticle("http://dkjhkhkdsjhk/khdkjhkjd/ksdjhkjd", 715);
     
    $xml .= genereArticle("http://dkjhkhkdsjhk/khdkjhkjd/ksdjhkjd", 716);

  2. #2
    Membre Expert
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 149
    Par défaut
    Beh libérer la mémoire sur les variables qui n'ont plus lieu d'être utilisées. :/
    http://fr2.php.net/unset

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 82
    Par défaut
    Citation Envoyé par transgohan Voir le message
    Beh libérer la mémoire sur les variables qui n'ont plus lieu d'être utilisées. :/
    http://fr2.php.net/unset
    Ce qui veut dire que je dois faire un unset sur toutes les variables contenues dans ma fonction (puisqu'à chaque appel de la fct, celles-ci sont échues)?

    Existe-t-il une fonction pour faire un unset global de mes variables fonction?

    Merci pour ta réponse

  4. #4
    Membre Expert
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 149
    Par défaut
    Après il faut tout de même relativiser...
    Un format XML n'est pas fait pour accueillir des centaines de méga-octets.
    Ton flux XML généré à chaque appel de fonction est conséquent. Et devrait l'être encore plus si je ne m'abuse puisque tu fais une boucle foreach mais tu réécrases les itération précédente d'ajout dans la variable $xml.
    Ajoutons à cela les variables non initialisées et inexistantes dans certains cas ($periodeOuverture).

    Bref c'est une sacrée usine à gaz...

    As-tu réellement l'utilité de générer un fichier xml de plusieurs milliers d'articles ? (100 appels de fonctions * x article(s))

    D'autant plus que ce que tu fais c'est regrouper des données déjà existantes au format XML. Pourquoi ne pas garder cet actuel agencement ?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 82
    Par défaut
    Citation Envoyé par transgohan Voir le message
    Après il faut tout de même relativiser...
    Un format XML n'est pas fait pour accueillir des centaines de méga-octets.
    Ton flux XML généré à chaque appel de fonction est conséquent. Et devrait l'être encore plus si je ne m'abuse puisque tu fais une boucle foreach mais tu réécrases les itération précédente d'ajout dans la variable $xml.
    Ajoutons à cela les variables non initialisées et inexistantes dans certains cas ($periodeOuverture).

    Bref c'est une sacrée usine à gaz...

    As-tu réellement l'utilité de générer un fichier xml de plusieurs milliers d'articles ? (100 appels de fonctions * x article(s))

    D'autant plus que ce que tu fais c'est regrouper des données déjà existantes au format XML. Pourquoi ne pas garder cet actuel agencement ?
    Le webservice que j'interroge me renvoie effectivement un flux XML.
    Je dois reformater ces données pour avoir un nouveau flux permettant d'insérer les données en BDD.
    Je n'ai ni la main sur le format de sortie du WS ni sur le format d'entrée du flux qui alimente la base.

    Je n'ai donc pas d'autre solution (si non, je suis preneur ) que de passer par une fct php.

    Le flux XML final que je dois obtenir est d'environ 2Mo...Rien d'affolant me semble-t-il?

    Comment optimiser tout cela pour que ça fonctionne quel que soit le nombre d'appel à la fct?

  6. #6
    Membre Expert
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 149
    Par défaut
    En effet un fichier de 2mio ne peut te porter souci.
    Pourrais-tu nous dire quel est l'erreur PHP affichée qui te porte préjudice ?

    Sinon au niveau de la libération des ressources il faudrait au minimum faire un unset($fluxXml) lorsque tu ne l'utilises plus.

Discussions similaires

  1. Problème mémoire sur Mac
    Par Hydro999 dans le forum R
    Réponses: 0
    Dernier message: 01/08/2009, 00h55
  2. Erreur sur appel fonction par Input/onclick
    Par heberco dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 05/09/2008, 18h46
  3. Problème mémoire sur un programme?
    Par theclem35 dans le forum VB 6 et antérieur
    Réponses: 21
    Dernier message: 23/12/2007, 07h53
  4. Rafraîchissement de mémoire sur la fonction VraiFAUX
    Par annedeblois dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 13/09/2007, 15h07
  5. problème Mémoire avant appel au main ?
    Par benhoeil dans le forum C
    Réponses: 18
    Dernier message: 13/10/2006, 11h24

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