Précédent   Forum des professionnels en informatique > PHP > Langage > Fonctions
Fonctions Forum d'entraide sur les fonctions PHP. Avant de poster -> FAQ fonctions et Sources diverses
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 29/03/2011, 12h01   #1
Candidat au titre de Membre du Club
 
Inscription : juillet 2010
Messages : 78
Détails du profil
Informations forums :
Inscription : juillet 2010
Messages : 78
Points : 13
Points : 13
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 :
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);
flo73 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/03/2011, 13h04   #2
Membre Expert
 
Avatar de transgohan
 
Homme Baptiste ROUSSEL
Étudiant
Inscription : janvier 2011
Messages : 802
Détails du profil
Informations personnelles :
Nom : Homme Baptiste ROUSSEL
Localisation : France, Territoire de Belfort (Franche Comté)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2011
Messages : 802
Points : 1 515
Points : 1 515
Beh libérer la mémoire sur les variables qui n'ont plus lieu d'être utilisées. :/
http://fr2.php.net/unset
transgohan est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/03/2011, 13h11   #3
Candidat au titre de Membre du Club
 
Inscription : juillet 2010
Messages : 78
Détails du profil
Informations forums :
Inscription : juillet 2010
Messages : 78
Points : 13
Points : 13
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
flo73 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/03/2011, 14h30   #4
Membre Expert
 
Avatar de transgohan
 
Homme Baptiste ROUSSEL
Étudiant
Inscription : janvier 2011
Messages : 802
Détails du profil
Informations personnelles :
Nom : Homme Baptiste ROUSSEL
Localisation : France, Territoire de Belfort (Franche Comté)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2011
Messages : 802
Points : 1 515
Points : 1 515
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 ?
transgohan est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/03/2011, 14h39   #5
Candidat au titre de Membre du Club
 
Inscription : juillet 2010
Messages : 78
Détails du profil
Informations forums :
Inscription : juillet 2010
Messages : 78
Points : 13
Points : 13
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?
flo73 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/03/2011, 15h32   #6
Membre Expert
 
Avatar de transgohan
 
Homme Baptiste ROUSSEL
Étudiant
Inscription : janvier 2011
Messages : 802
Détails du profil
Informations personnelles :
Nom : Homme Baptiste ROUSSEL
Localisation : France, Territoire de Belfort (Franche Comté)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2011
Messages : 802
Points : 1 515
Points : 1 515
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.
transgohan est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/03/2011, 15h39   #7
Membre éprouvé
 
Avatar de radicaldreamer
 
Homme Guillaume
Développeur Web
Inscription : décembre 2007
Messages : 353
Détails du profil
Informations personnelles :
Nom : Homme Guillaume
Âge : 21
Localisation : France, Haut Rhin (Alsace)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : décembre 2007
Messages : 353
Points : 473
Points : 473
Si c'est à faire qu'une fois....

http://php.net/manual/fr/function.set-time-limit.php

Tu changes la limite de temps, tu fais ta fonction, tu la lances et tu vas boire un café?
__________________
Si ce que tu as à dire n'est pas plus beau que le silence, alors tais toi.

- Pensez à voter pour les messages qui vous ont été utiles ainsi que de mettre
radicaldreamer 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 20h39.


 
 
 
 
Partenaires

Hébergement Web