Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > XML > SimpleXML
SimpleXML Forum d'entraide pour l'extension SimpleXML, qui permet de manipuler des documents XML en PHP (approche DOM).
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 25/03/2011, 10h06   #1
Invité de passage
 
Homme
Développeur Web
Inscription : mars 2011
Messages : 2
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : mars 2011
Messages : 2
Points : 0
Points : 0
Par défaut Soucis de mémoire

Bonjour à tous!

Je viens à vous parce que vous semblez être mon dernier recours.

En effet, je développe une fonction qui permet de vérifier la validité d'un XML (via un XSD), et ensuite de parser le XML de manière récursive afin de remplir des tables en base de données, tables correspondant à la hiérarchie de mon fichier XML.

Il y a trois types de XML (donc trois XSD), et deux des trois XML sont remplis entièrement dans ma base de données. Le problème se situe donc au niveau du troisième fichier qui ne remplit qu'une partie de ses données.

J'ai regardé au niveau de la mémoire, du temps d'exécution alloué à PHP, ainsi qu'au timeout d'Apache, modifications n'ayant eu aucune répercution sur le script. Peut-être, ai-je manqué ou raté quelque chose?

Le script se termine par une page blanche sans aucune erreur et impossible de savoir d'où cela pourrait venir...

Voici un exemple de la composition type du fichier.xml :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xml>
<element_a>value</element_a>
<element_b>value</element_b1>
<element_c>
    <element_c_1>value</element_c_1>	
</element_c>
<element_d>
    <element_d_1>
        <element_d_11>value</element_d_11>
        <element_d_12>value</element_d_12>
    </element_d_1>
    <element_d_2>
        <element_d_21>value</element_d_21>
        <element_d_22>value</element_d_22>
     </element_d_2>
</element_d>
</xml>
Et voici mes fonctions PHP :

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
	// fonction qui ouvre le fichier xml reçu en paramètre
	public function xmlParse($xml)
	{       
		//on charge notre fichier
		$parseXml = simplexml_load_file($xml);
		// on préfixe le nom de la table pour l'insertion des données
		$this->_table =  'xml_'.$parseXml->getName();
		// on attribue notre <root> à _fileXml
		$this->_fileXml = $parseXml->getName();
		// et on parse le xml
		$this->_recursif($parseXml);			
	}
 
    // fonction récursive qui parcourt le fichier xml
    // et insert les données à la volée en base de données
	protected function _recursif($xmlObj) {	
		// on parcourt les éléments enfants
		foreach($xmlObj->children() as $child) {				
 
				//si on a plus d'enfant, on ajoute en base
				if(!$this->_hasChildren($child)){				
    				    $insert = "INSERT INTO " . $this->_table . '_' . $child->getName() ." (" . implode(', ', array_keys((array) $child)) . ") VALUES ('" . implode("','", (array) $child) . "')";				
				    $this->_em->getConnection()->executeUpdate($insert);			
 
					if(!empty($this->_parent)){
						$this->_table = 'xml_' . $this->_fileXml . '_' . $this->_parent;
					} else {
						$this->_table = 'xml_' . $this->_fileXml;
					}
 
				//sinon, on rapelle notre fonction et parse les enfants
				} else {						
					$this->_parent = $child->getName();
					$this->_recursif($child);
				}		
		}
	}
 
	// fonction qui vérifie si $element a des enfants
	protected function _hasChildren($element)
	{		
		$hasChild = false;		
		//on parcourt notre element
		foreach($element->children() as $child){							
			$keys = array_keys((array)$child);			
			foreach($keys as $v){				
				//si notre element est un objet, alors on a un enfant
				if(!is_numeric($v)){	
					$hasChild = true;					
					if(empty($this->_parent)){
						$this->_table .= '_' . $element->getName();	
					}else{
							$this->_table = 'xml_' . $this->_fileXml . '_' . $element->getName();	
					}					
				} 
				return $hasChild;				
			}			
		}	
	}
Si vous avez des idées du pourquoi, je suis preneur
Vincent-C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/03/2011, 12h31   #2
Membre chevronné
 
Homme Taoufiq Ben
Développeur Web
Inscription : mai 2009
Messages : 456
Détails du profil
Informations personnelles :
Nom : Homme Taoufiq Ben
Âge : 25
Localisation : Maroc

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

Informations forums :
Inscription : mai 2009
Messages : 456
Points : 639
Points : 639
Est ce que ta essaiyé la fonction
m4riachi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/03/2011, 13h45   #3
Invité de passage
 
Homme
Développeur Web
Inscription : mars 2011
Messages : 2
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : mars 2011
Messages : 2
Points : 0
Points : 0
Malheureusement oui j'ai essayé, en mettant comme ceci :

Code :
1
2
3
4
 
	set_time_limit(0);
	$this->xmlParse($xml);
	set_time_limit(30);
Puisqu'au tout début, j'avais une erreur dû à mon set_time_limit qui était à 30 secondes. Mais avec un 0 (donc illimité), je n'ai aucune réponse du script qui m'affiche une page blanche et qui ne termine pas ses enregistrements en base.
Vincent-C 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 23h08.


 
 
 
 
Partenaires

Hébergement Web