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

Bibliothèques et frameworks PHP Discussion :

[SimpleXML] Soucis de mémoire


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    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 : 1
    Points
    1
    Par défaut [SimpleXML] 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 : 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
    <?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 : 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
    	// 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

  2. #2
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2009
    Messages
    736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Maroc

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

    Informations forums :
    Inscription : Mai 2009
    Messages : 736
    Points : 1 101
    Points
    1 101
    Par défaut
    Est ce que ta essaiyé la fonction
    A la recherche d'un film : http://chercher-un-film.com

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    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 : 1
    Points
    1
    Par défaut
    Malheureusement oui j'ai essayé, en mettant comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

Discussions similaires

  1. soucis de mémoire d'occupation d'un programme
    Par messaoud86 dans le forum Android
    Réponses: 1
    Dernier message: 29/04/2016, 12h28
  2. Souci en mémoire lors de l'inclusion d'une DLL en C ?
    Par benj63 dans le forum C++Builder
    Réponses: 3
    Dernier message: 13/11/2013, 15h07
  3. Soucis de libération mémoire
    Par kkt8 dans le forum SWT/JFace
    Réponses: 2
    Dernier message: 03/10/2011, 11h23
  4. Souci de mémoire : tableaux trop grands
    Par driss80 dans le forum Fortran
    Réponses: 8
    Dernier message: 13/03/2008, 14h42
  5. [SimpleXML] simplexml_load_file petit soucis de paramètre
    Par snipes dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 23/09/2007, 11h11

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