Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3020 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  PHP fait n'importe quoi avec les XML dès qu'ils dépassent 200 ko ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

PHP fait n'importe quoi avec les XML dès qu'ils dépassent 200 ko ?

n°1155162
Chase
Posté le 20-07-2005 à 17:42:32  profilanswer
 

Bonjour :hello:
 
Voici la structure de mon XML :
 

Code :
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <?xml-stylesheet type="text/xsl" href="log.xsl"?>
  3. <log>
  4.   <visite>
  5.     <site>monhébergeur.net</site>
  6.     <date>2005-07-20</date>
  7.     <heure>23:21:58</heure>
  8.     <ip>67.221.142.30</ip>
  9.     <lien>/index.php</lien>
  10.   </visite>
  11.   <visite>
  12.     ...
  13.   </visite>
  14. </log>


 
Et le but du fichier PHP est d'insérer une nouvelle entrée "visite" à la suite des autres, avec tous les bons renseignements, à chaque exécution du php. J'utilise PHP 5 et DOM. Voici la source :
 

Code :
  1. // ouverture du document XML
  2. $dom = new DOMDocument('1.0', 'utf-8');
  3. $dom->formatOutput = true;
  4. $dom->load('log.xml');
  5. // nouveau noeud visite
  6. $node_visite = $dom->createElement('visite');
  7. $dom->documentElement->appendChild($node_visite);
  8. // date
  9. $node_date = $dom->createElement('date', htmlspecialchars(date('Y-m-d')));
  10. $node_visite->appendChild($node_date);
  11. // heure
  12. $node_heure = $dom->createElement('heure', htmlspecialchars(date('H:i:s')));
  13. $node_visite->appendChild($node_heure);
  14. // ip
  15. $node_ip = $dom->createElement('ip', htmlspecialchars($ip));
  16. $node_visite->appendChild($node_ip);
  17. // lien
  18. $node_lien = $dom->createElement('lien', htmlspecialchars($lien));
  19. $node_visite->appendChild($node_lien);
  20. // enregistrement
  21. $dom->save('log.xml');


 
Alors d'abord, le fichier n'est pas bien formaté avec les tabulations, tout est écrit à la suite, malgré la ligne $dom->formatOutput = true;. Comment faire ?
 
Et figurez-vous qu'au bout de quelques centaines de Ko (variable sur plusieurs essais, mais ça tourne entre 200 et 300 ko), le XML ne ressemble plus à rien, il devient syntaxiquement invalide ! Regardez :
 

Code :
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <?xml-stylesheet type="text/xsl" href="log.xsl"?>
  3. <log>
  4.   <visite>     <-------- une balise isolée !
  5.   <visite>
  6.     ** correct **
  7.   </visite>
  8.   etc... que des noeuds visites corrects ici
  9.   <visite>
  10.     ** correct **
  11.   </visite>
  12. </log>
  13. 50</lien></visite></log>      <------ une espèce de "reste" après la fin du noeud racine !


 
Voilà !
Vous avez une idée ?
ça vient de DOM qui n'est pas encore au point ? du serveur (free) ? d'une connerie de ma part ?
 
Merci d'avance :hello:


Message édité par Chase le 20-07-2005 à 17:46:08
mood
Publicité
Posté le 20-07-2005 à 17:42:32  profilanswer
 

n°1155174
sielfried
Posté le 20-07-2005 à 17:54:20  profilanswer
 

J'ai jamais utilisé DOM/XML donc supposition au pif : le

Code :
  1. $dom->documentElement->appendChild($node_visite);

devrait pas se trouver à la fin de ton script, avant le save ?
 
Ca dépend si le truc marche avec des références ou pas en fait.


Message édité par sielfried le 20-07-2005 à 17:54:38

---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
n°1155176
fluminis
Posté le 20-07-2005 à 17:57:26  profilanswer
 

si je peux me permettre une question, pourquoi stoker ce genre dinformations dans un fichier xml ?
Pourquoi ne pas utiliser la base de données de free ?  
On sait qu'au moins mysql a fait ses preuves


---------------
http://poemes.iceteapeche.com - http://www.simuland.net
n°1155242
Chase
Posté le 20-07-2005 à 19:08:50  profilanswer
 

sielfried a écrit :

J'ai jamais utilisé DOM/XML donc supposition au pif : le

Code :
  1. $dom->documentElement->appendChild($node_visite);

devrait pas se trouver à la fin de ton script, avant le save ?
 
Ca dépend si le truc marche avec des références ou pas en fait.


 
oui je crois bien que ça marche par référence ;)
sinon le php déconnerait dès le début et pas seulement à partir d'une certaine taille.

n°1155248
Chase
Posté le 20-07-2005 à 19:11:35  profilanswer
 

fluminis a écrit :

si je peux me permettre une question, pourquoi stoker ce genre dinformations dans un fichier xml ?
Pourquoi ne pas utiliser la base de données de free ?  
On sait qu'au moins mysql a fait ses preuves


 
XML est beaucoup plus simple pour afficher le résultat, car j'ai juste à aller à l'adresse http://serveur/log.xml et le XSL (de 2 ko) fait tout le boulot de présentation sous forme de tableau.

n°1155261
fluminis
Posté le 20-07-2005 à 19:21:27  profilanswer
 

c'est toi qui a raison, le XSL est puissant, j'ai du mal a m'habituer au Xml
 
pour moi il y a telement de caracteres inutiles <...> et </...> que je trouve une bdd bcp plus interessante. Surtout que des logs comme cela, ce qui peut etre interessant c'est de faire un traitement dessus (genre combien de personnes sont venue sur une page particuliere, combien entre telle et telle heure)
 
Amuse toi bien avec ton xml et ton xsl


---------------
http://poemes.iceteapeche.com - http://www.simuland.net
n°1155322
Chase
Posté le 20-07-2005 à 21:13:36  profilanswer
 

fluminis a écrit :

c'est toi qui a raison, le XSL est puissant, j'ai du mal a m'habituer au Xml
 
pour moi il y a telement de caracteres inutiles <...> et </...> que je trouve une bdd bcp plus interessante. Surtout que des logs comme cela, ce qui peut etre interessant c'est de faire un traitement dessus (genre combien de personnes sont venue sur une page particuliere, combien entre telle et telle heure)
 
Amuse toi bien avec ton xml et ton xsl


 
Non en fait je suis d'accord avec toi, j'ai toujours stocké en bdd et ceci est mon premier essai de stockage XML. Comme tu as pu le voir c'est un échec cuisant... je m'attendais à ce que ça rame un peu lorsque le fichier ferait 5 ou 6 Mo, mais de là à tout mélanger dès 200 ko :sweat:
 
Si ça t'intéresse voilà à quoi ressemble le XSL :
 

Code :
  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  3. <xsl:output
  4. method="html"
  5. encoding="utf-8"
  6. omit-xml-declaration="yes"
  7. doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
  8. doctype-system="DTD/xhtml1-strict.dtd"
  9. cdata-section-elements="style script"
  10. indent="yes"
  11. media-type="text/html"/>
  12. <xsl:template match="log">
  13. <html>
  14. <head>
  15. <title>Log des connexions</title>
  16. </head>
  17. <body>
  18. <table>
  19.   <tr>
  20.     <th>Site</th>
  21.     <th>Date<br />Heure</th>
  22.     <th>IP<br />DNS</th>
  23.     <th>Lien<br />Référent</th>
  24.   </tr>
  25.   <xsl:apply-templates select="visite">
  26.     <xsl:sort select="date" order="descending"/>
  27.     <xsl:sort select="heure" order="descending"/>
  28.   </xsl:apply-templates>
  29. </table>
  30. </body>
  31. </html>
  32. </xsl:template>
  33. <xsl:template match="visite">
  34. <tr>
  35.   <xsl:if test="position() mod 2 = 0">
  36.     <xsl:attribute name="class"><xsl:text>ligne_paire</xsl:text></xsl:attribute>
  37.   </xsl:if>
  38.   <td>
  39.   <xsl:choose>
  40.     <xsl:when test="site = 'mon vrai hébergeur'">
  41.       <img src="ok.gif">
  42.         <xsl:attribute name="title"><xsl:value-of select="site"/></xsl:attribute>
  43.       </img>
  44.     </xsl:when>
  45.     <xsl:otherwise>
  46.       <img src="stop.gif">
  47.         <xsl:attribute name="title"><xsl:value-of select="site"/></xsl:attribute>
  48.       </img>
  49.     </xsl:otherwise>
  50.   </xsl:choose>
  51.   </td>
  52.   <td><xsl:value-of select="date"/><br /><xsl:value-of select="heure"/></td>
  53.   <td><strong><xsl:value-of select="dns"/></strong><br /><xsl:value-of select="ip"/></td>
  54.   <td><strong><xsl:value-of select="lien"/></strong><br /><xsl:value-of select="referent"/></td>
  55. </tr>
  56. </xsl:template>
  57. </xsl:stylesheet>


 
bon ok, ça vaut pas un traitement par PHP et la syntaxe est lourde :o


Message édité par Chase le 20-07-2005 à 21:14:28
n°1155414
zapan666
Tout est relatif
Posté le 20-07-2005 à 23:21:27  profilanswer
 

Chase a écrit :

Et figurez-vous qu'au bout de quelques centaines de Ko (variable sur plusieurs essais, mais ça tourne entre 200 et 300 ko), le XML ne ressemble plus à rien, il devient syntaxiquement invalide ! Regardez :


même problème et pour la même utilisation.  
Mais dans mes données, je stocke le referer du visiteur, et je me suis demandé si c'était pas un caractère qui foutait la merde...
 
Je me suis pas trop penché sur le problème car..
...bah, mon site marche quand même sans : je perd quelque stat, c'est tout.
...j'arrive pas à reproduire le problème moi même  :sweat:  
...j'ai pas dans mes priorités pour l'instant
 
Donc tu n'es pas seul face à ce problème  :D  
 
Exemple de problème qui j'ai eux dans le fichier XML :  

Code :
  1. <request>p=groupe&amp;id_groupe=102</request><ip>192.168.0.2</ip></visite></liste_visite>
  2. echerche+Google</query><request>p=news</request><ip>192.168.0.2</ip></visite></liste_visite>


(sachant que liste_visite est l'élement racine...et qu'on ne peut avoir qu'un seul élement racine par document XML)
 

Code :
  1. <referer>http://pingouinland.free.fr/index2.php</referer><query></query><request>p=index</request><ip>192.168.0.2</ip></visite></liste_visite>
  2. /liste_visite>


Ici, il y a encore 2 élements racines qui se ferment, et la dernière balise est mal fermée.
 
 
Mes fichiers en erreur font :  
101Ko, 47Ko, 41Ko.
 
J'ai des fichiers sans eurreurs a plus de 80Ko  
 
(donc, dans mon cas, je ne suis pas sûr que le problème vienne de la taille du fichier)
 
 
 
Il est à noté que je suis encore sur php4 + domXML (qui n'est pas génial sur le php4...)
Je n'ai pas encore essayé avec simpleXml de php5.
...et j'ai pas essayé non plus avec la base de données embarqué de php (y'en a bien une, je crois, non ?) non plus  :D


---------------
my flick r - Just Tab it !
n°1155465
Chase
Posté le 21-07-2005 à 00:25:16  profilanswer
 

Le problème a disparu en supprimant le referer ? ou bien j'ai mal compris ?
 
Parce que moi aussi j'enregistre le referer (mais je l'ai enlevé ici pour que ça soit plus lisible).
 
Pour ton doute sur les caractères spéciaux, tu as essayé en faisant htmlspecialchars() ?
 
On va trouver une solution :hello:

n°1155551
zapan666
Tout est relatif
Posté le 21-07-2005 à 09:08:11  profilanswer
 

Chase a écrit :

Le problème a disparu en supprimant le referer ? ou bien j'ai mal compris ?
 
Parce que moi aussi j'enregistre le referer (mais je l'ai enlevé ici pour que ça soit plus lisible).
 
Pour ton doute sur les caractères spéciaux, tu as essayé en faisant htmlspecialchars() ?
 
On va trouver une solution :hello:


bah non, j'ai pas résolu, car j'ai pas essayé de résoudre le problème  :D  
 
et oui, j'espère bien qu'on va trouvé une solution !
et non, j'ai pas essayé sans le referer, ni avec htmlspecialchars


---------------
my flick r - Just Tab it !
mood
Publicité
Posté le 21-07-2005 à 09:08:11  profilanswer
 

n°1155632
FlorentG
Unité de Masse
Posté le 21-07-2005 à 10:46:51  profilanswer
 

N'oubliez pas qu'il n'y a pas besoin de faire un htmlspecialchars, du moins sous DOMXML en PHP4 : c'est fait automatiquement :)

n°1155638
FlorentG
Unité de Masse
Posté le 21-07-2005 à 10:51:11  profilanswer
 

Après vérif, sous DOM en PHP5, il faut le htmlspecialchars si on met une string dans createElement. Par contre si on fait comme ça :

$node_date = $dom->createElement('date');
$node_date->appendChild($dom->createTextNode(date('Y-m-d')));


Là le specialchars est fait tout seul

n°1155665
sielfried
Posté le 21-07-2005 à 11:08:08  profilanswer
 

Bon alors j'ai testé un peu tout ça (PHP5 aussi) et aucun problème, même après 200Ko, le fichier est propre. :o
 
Sinon pour un affichage propre il faut rajouter

Code :
  1. $dom->preserveWhiteSpace = false;

.


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  PHP fait n'importe quoi avec les XML dès qu'ils dépassent 200 ko ?

 

Sujets relatifs
[XML]-[XSL] JS[PHP] Liste déroulant et variable
[PHP] - mysql - connaitre la derniere action sur une liste de tablesPriorité PHP/Javascript
[PHP/MySQL] update avec reprise de l'ancienne valeur d'un champ[PHP/MySQL] count(*) et nombre de résultats NULL
[PHP] reduire le poids d'une image.[PHP] Generateur de code
[PHP / Exchange]XML XSL-FO
Plus de sujets relatifs à : PHP fait n'importe quoi avec les XML dès qu'ils dépassent 200 ko ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR