Test de la solution fichier XML

Jump to: navigation, search

Test

Un script a été utilisé pour créer un fichier de logs de 30000 entrées.

#!/bin/bash
i=0

echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>" > logs.xml
echo "<!DOCTYPE logs SYSTEM \"logs.dtd\">" >> logs.xml
echo "<logs>" >> logs.xml

while [ $i -lt 10000 ]
  do
  echo " <log>" >> logs.xml
  echo "  <date>`date`</date>" >> logs.xml
  echo "  <login>login$i</login>" >> logs.xml
  echo "  <droits>droits</droits>" >> logs.xml
  echo "  <operation>connexion</operation>" >> logs.xml
  echo "  <tables>" >> logs.xml
  echo "  </tables>" >> logs.xml
  echo " </log>" >> logs.xml
  
  echo " <log>" >> logs.xml
  echo "  <date>`date`</date>" >> logs.xml
  echo "  <login>login$i</login>" >> logs.xml
  echo "  <droits>droits</droits>" >> logs.xml
  echo "  <operation>modification</operation>" >> logs.xml
  echo "  <tables>" >> logs.xml
  echo "   <tab id=\"table1\">" >> logs.xml
  echo "    <champ id=\"champ1\">valeur1</champ>" >> logs.xml
  echo "   </tab>" >> logs.xml
  echo "   <tab id=\"table2\">" >> logs.xml
  echo "    <champ id=\"champ2\">valeur2</champ>" >> logs.xml
  echo "   </tab>" >> logs.xml
  echo "  </tables>" >> logs.xml
  echo " </log>" >> logs.xml

  echo " <log>" >> logs.xml
  echo "  <date>`date`</date>" >> logs.xml
  echo "  <login>login$i</login>" >> logs.xml
  echo "  <droits>droits</droits>" >> logs.xml
  echo "  <operation>deconnexion</operation>" >> logs.xml
  echo "  <tables>" >> logs.xml
  echo "  </tables>" >> logs.xml
  echo " </log>" >> logs.xml

  i=$(($i+1))
done

echo "</logs>" >> logs.xml

La DTD utilisée pour le fichier XML étant la suivante :

<?xml version="1.0" encoding="utf-8"?>
<!ELEMENT logs (log*)>
<!ELEMENT log (date, login, droits, operation, tables)>
<!ELEMENT date (#PCDATA)>
<!ELEMENT login (#PCDATA)>
<!ELEMENT droits (#PCDATA)>
<!ELEMENT operation (#PCDATA)>
<!ELEMENT tables (tab*)>
<!ELEMENT tab (champ*)>
<!ATTLIST tab id CDATA #REQUIRED>
<!ELEMENT champ (#PCDATA)>
<!ATTLIST champ id CDATA #REQUIRED>

Temps nécessaire à la création du fichier de logs : 1 minute 31 secondes.

Ensuite, un script PHP est utilisé pour faire une requète sur le fichier logs.xml créé et pour chronometrer le temps necessaire à l'obtention du résultat. La requète consiste à demander combien d'opérations ont été effectuées par la personne ayant l'identifiant 'login15'.

<?php
$temps = microtime();
$temps = explode(' ', $temps);
$debut = $temps[1] + $temps[0];

$file = "logs.xml";
$depth = array();
$last_name = "";
$n = 0;

function startElement($parser, $name, $attrs)
{
  global $depth;
  global $last_name;
  $last_name = $name;
  $depth[$parser]++;
}

function endElement($parser, $name)
{
  global $depth;
  $depth[$parser]--;
}

function characterData($parser, $data)
{
  global $n;
  global $depth;
  global $last_name;
  if(($last_name == "LOGIN") && ($data == "login15"))
     {
      $n++;
    }
}

$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser, "characterData");
 
if(!($fp = fopen($file, "r")))
{
  die("could not open XML input");
}

while($data = fread($fp, 4096))
{
  if(!xml_parse($xml_parser, $data, feof($fp)))
    {
      die(sprintf("XML error : %s at line %d", xml_error_string(xml_get_error_code($xml_parser)), xml_get_current_line_number($xml_parser)));
    }
}

echo 'Nombre d\'opérations effectuées par login15 : '.$n.'
'; xml_parser_free($xml_parser); $temps = microtime(); $temps = explode(' ', $temps); $fin = $temps[1] + $temps[0]; echo 'Page générée en '.round(($fin - $debut), 6).' secondes.'; ?>

Résultat

Nombre d'opérations efféctuées par login15 : 3

Le résultat est exact.

  • taille du fichier log : 6.8 Mo
  • temps de traitement de la requète : 5.8 s