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

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

Marsh Posté le 20-07-2005 à 17:42:32    

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
Reply

Marsh Posté le 20-07-2005 à 17:42:32   

Reply

Marsh Posté le 20-07-2005 à 17:54:20    

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
Reply

Marsh Posté le 20-07-2005 à 17:57:26    

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
Reply

Marsh Posté le 20-07-2005 à 19:08:50    

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.

Reply

Marsh Posté le 20-07-2005 à 19:11:35    

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.

Reply

Marsh Posté le 20-07-2005 à 19:21:27    

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
Reply

Marsh Posté le 20-07-2005 à 21:13:36    

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
Reply

Marsh Posté le 20-07-2005 à 23:21:27    

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 !
Reply

Marsh Posté le 21-07-2005 à 00:25:16    

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:

Reply

Marsh Posté le 21-07-2005 à 09:08:11    

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 !
Reply

Marsh Posté le 21-07-2005 à 09:08:11   

Reply

Marsh Posté le 21-07-2005 à 10:46:51    

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

Reply

Marsh Posté le 21-07-2005 à 10:51:11    

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

Reply

Marsh Posté le 21-07-2005 à 11:08:08    

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
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed