begin process at 2010 02 10 05:11:57
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Fichier / Disque

 > PARSER DE LOG QUAKE 3, URBAN TERROR,...

PARSER DE LOG QUAKE 3, URBAN TERROR,...


 Information sur la source

Note :
Aucune note
Catégorie :Fichier / Disque Classé sous :parser, quake, urban, terror, arena Niveau :Débutant Date de création :28/07/2008 Date de mise à jour :28/07/2008 16:51:55 Vu / téléchargé :2 827 / 61

Auteur : Ilsundal

Ecrire un message privé
Site perso
Commentaire sur cette source (8)
Ajouter un commentaire et/ou une note

 Description

Parser de fichier .log de serveur de jeux comme Quake III, Urban Terror, Open Arena, Nexuiz ! Il permet de récupérer les points totaux de chaque Joueurs qui peuvent par la suite être utiliser comme sur GameTracker pour des stats de tout les joueurs ! Voir même une possibilité par la suite de créer un espace membre sur votre serveur pour sauver les stats de ceux qui sont inscrits !!!

Source

  • <?Php
  • /****************************************************
  • * Auteur : MEYER Thibault
  • * Date : Vendredi 25 juillet 2008
  • * fichier : score.php
  • ****************************************************/
  • ?>
  • <?Php
  • function EstPresent($Pseudo, $Table)
  • {
  • for($i=0; $i < count($Table); $i++)
  • {
  • if($Table[$i]["Joueur"] == $Pseudo)
  • {
  • return true;
  • }
  • }
  • return false;
  • }
  • function LireLog($Fichier)
  • {
  • $Log = "";
  • $hFile = fopen($Fichier, "r");
  • while(!feof($hFile))
  • {
  • $Log .= fgets($hFile);
  • }
  • fclose($hFile);
  • if(strstr($Log, "score:") == NULL) return false;
  • $answer = array();
  • preg_match_all('(.*)', $Log, $answer, PREG_SET_ORDER);
  • $Log = "";
  • for($i=0,$j=0; $i<count($answer); $i++)
  • {
  • if(strstr($answer[$i][0], "score:") != null)
  • {
  • $Log[$j++] = $answer[$i][0];
  • }
  • }
  • $Stats = array();
  • for($i=0; $i<count($Log); $i++)
  • {
  • if($i == 0) sscanf($Log[$i], "%d:%d score: %d ping: %d client: %d %s %s %s %s" , $NULL, $NULL, $Stats[$i]["score"], $NULL, $NULL, $Stats[$i]["Joueur"], $Stats[$i]["nom2"], $Stats[$i]["nom3"], $Stats[$i]["nom4"]);
  • else sscanf($Log[$i], "%d:%d score: %d ping: %d client: %d %s %s %s %s" , $NULL, $NULL, $Stats[$i]["score"], $NULL, $NULL, $Stats[$i]["Joueur"], $Stats[$i]["nom2"], $Stats[$i]["nom3"], $Stats[$i]["nom4"]);
  • }
  • for($i=0; $i<count($Stats); $i++)
  • {
  • if(@$Stats[$i]["nom2"] != NULL) $Stats[$i]["Joueur"] .= " ".$Stats[$i]["nom2"];
  • if(@$Stats[$i]["nom3"] != NULL) $Stats[$i]["Joueur"] .= " ".$Stats[$i]["nom3"];
  • if(@$Stats[$i]["nom4"] != NULL) $Stats[$i]["Joueur"] .= " ".$Stats[$i]["nom4"];
  • }
  • //Cration de la liste des joueurs (regroupe les noms en double)
  • $Stats2[0]["Joueur"] = "";
  • for($i=0, $j=0; $i < count($Stats); $i++)
  • {
  • if(EstPresent($Stats[$i]["Joueur"], $Stats2) == false)
  • {
  • $Stats2[$j]["Joueur"] = $Stats[$i]["Joueur"];
  • $Stats2[$j++]["score"] = 0;
  • }
  • }
  • //Rregroupement des points par Joueurs
  • for($i=0; $i < count($Stats2); $i++)
  • {
  • for($j=0; $j < count($Stats); $j++)
  • {
  • if($Stats[$j]["Joueur"] == $Stats2[$i]["Joueur"]) $Stats2[$i]["score"] += $Stats[$j]["score"];
  • }
  • }
  • //Retourne la tableau
  • return $Stats2;
  • }
  • function EffaceLog($Fichier)
  • {
  • if(!file_exists($Fichier)) return false;
  • $hFile = fopen($Fichier, "w");
  • if(!$hFile) return false;
  • return true;
  • }
  • function array_sort($array, $key)
  • {
  • for ($i = 0; $i < sizeof($array); $i++)
  • {
  • $sort_values[$i] = $array[$i][$key];
  • }
  • asort ($sort_values);
  • reset ($sort_values);
  • while (list ($arr_key, $arr_val) = each ($sort_values))
  • {
  • $sorted_arr[] = $array[$arr_key];
  • }
  • return $sorted_arr;
  • }
  • ?>
  • <?
  • //EXEMPLE
  • $mesStats = LireLog("games3.log");
  • $mesStats = array_sort($mesStats, "score");
  • if($mesStats == false) echo "AUCUNE PARTIE A TRAITER";
  • else{
  • for($i=count($mesStats)-1; $i>=0; $i--)
  • {
  • echo $mesStats[$i]["Joueur"]." : ".$mesStats[$i]["score"];
  • echo "<br>";
  • }
  • }
  • //QUAND MISE A JOUR DES JOUEURS SUR LA BASE DE DONNéES, ON VIDE LE JOURNAL
  • echo "<br>";
  • //if(EffaceLog("games3.log") == true) echo "EFFACER OK";
  • //else echo "EFFACER ERREUR";
  • ?>
<?Php
/****************************************************
 * Auteur : MEYER Thibault
 * Date : Vendredi 25 juillet 2008
 * fichier : score.php
 ****************************************************/
?>
<?Php
  function EstPresent($Pseudo, $Table)
  {
      for($i=0; $i < count($Table); $i++)
      {
        if($Table[$i]["Joueur"] == $Pseudo)
        {
          return true;
        }
      }
      return false;
  }
      
  function LireLog($Fichier)
  {
      $Log = "";
      $hFile = fopen($Fichier, "r");
      while(!feof($hFile))
      {
        $Log .= fgets($hFile);
      }
      fclose($hFile);
      
      if(strstr($Log, "score:") == NULL) return false;

      $answer = array();
      preg_match_all('(.*)', $Log, $answer, PREG_SET_ORDER);

      
      $Log = "";
      for($i=0,$j=0; $i<count($answer); $i++)
      {
        if(strstr($answer[$i][0], "score:") != null)
        {
          $Log[$j++] = $answer[$i][0];
        }
      }
      
      $Stats = array();
      for($i=0; $i<count($Log); $i++)
      {
        if($i == 0) sscanf($Log[$i], "%d:%d score: %d ping: %d client: %d %s %s %s %s" , $NULL, $NULL, $Stats[$i]["score"], $NULL, $NULL, $Stats[$i]["Joueur"], $Stats[$i]["nom2"], $Stats[$i]["nom3"], $Stats[$i]["nom4"]);
        else sscanf($Log[$i], "%d:%d score: %d ping: %d client: %d %s %s %s %s" , $NULL, $NULL, $Stats[$i]["score"], $NULL, $NULL, $Stats[$i]["Joueur"], $Stats[$i]["nom2"], $Stats[$i]["nom3"], $Stats[$i]["nom4"]);
      }
      
      for($i=0; $i<count($Stats); $i++)
      {
        if(@$Stats[$i]["nom2"] != NULL) $Stats[$i]["Joueur"] .= " ".$Stats[$i]["nom2"];
        if(@$Stats[$i]["nom3"] != NULL) $Stats[$i]["Joueur"] .= " ".$Stats[$i]["nom3"];
        if(@$Stats[$i]["nom4"] != NULL) $Stats[$i]["Joueur"] .= " ".$Stats[$i]["nom4"];
      }
      
      //Cration de la liste des joueurs (regroupe les noms en double)
      $Stats2[0]["Joueur"] = "";
      for($i=0, $j=0; $i < count($Stats); $i++)
      {
          if(EstPresent($Stats[$i]["Joueur"], $Stats2) == false)
          {
            $Stats2[$j]["Joueur"] = $Stats[$i]["Joueur"];
            $Stats2[$j++]["score"] = 0;
          }
      }
      

      //Rregroupement des points par Joueurs
      for($i=0; $i < count($Stats2); $i++)
      {
          for($j=0; $j < count($Stats); $j++)
          {
             if($Stats[$j]["Joueur"] == $Stats2[$i]["Joueur"]) $Stats2[$i]["score"] += $Stats[$j]["score"];
          }
      }
      
      //Retourne la tableau
      return $Stats2;
  }
  
  
  function EffaceLog($Fichier)
  {
      if(!file_exists($Fichier)) return false;
      
      $hFile = fopen($Fichier, "w");
      if(!$hFile) return false;
      return true;
  }
  
  function array_sort($array, $key)
    {
        for ($i = 0; $i < sizeof($array); $i++)
        {
            $sort_values[$i] = $array[$i][$key];
        }
        asort ($sort_values);
        reset ($sort_values);
        while (list ($arr_key, $arr_val) = each ($sort_values))
        {
            $sorted_arr[] = $array[$arr_key];
        }
        return $sorted_arr;
    } 
?>


<?
    //EXEMPLE
    $mesStats = LireLog("games3.log");
    $mesStats = array_sort($mesStats, "score");
    if($mesStats == false) echo "AUCUNE PARTIE A TRAITER";
    else{
      for($i=count($mesStats)-1; $i>=0; $i--)
      {
        echo $mesStats[$i]["Joueur"]." : ".$mesStats[$i]["score"];
        echo "<br>";
      }
    }
    
    //QUAND MISE A JOUR DES JOUEURS SUR LA BASE DE DONNéES, ON VIDE LE JOURNAL
    echo "<br>";
    //if(EffaceLog("games3.log") == true) echo "EFFACER OK";
    //else echo "EFFACER ERREUR";
?>

 Conclusion

Les éléments du tableau "nom2", "nom3"... C'est pour si jamais les gars on des pseudo du genre "Vieux Troll Des Bois" au lieu de "VieuxTrollDesBois"

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

28 juillet 2008 16:51:55 :
Ajout d'une conclusion

 Sources du même auteur

Source avec Zip Source avec une capture CALCUL VOLUME D'UNE PARABOLOIDE

 Sources de la même categorie

Source avec Zip EFFACER LES FICHIERS IMAGES ( .PNG ), D'UN RÉPERTOIRE TEMPS ... par christophe0511
COURTE ET SIMPLE FONCTION RÉCURSIVE POUR LECTURE DE RÉPERTOI... par mbdx
Source avec Zip Source avec une capture GESTIONNAIRE DE FICHIERS | MYSQL PHP 5.X {NEMENTON PHP MANA... par Nementon
Source avec Zip Source avec une capture LISTE REPERTOIRE (DIR EN PHP) par mephistope
Source avec Zip LIRE UNIQUEMENT LES X DERNIERS OCTETS D'UN FICHIER DISTANT (... par Equilibrius

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture PARSER ALLOCINE par cyrhades
Source avec Zip TEMPLATE ENGINE SIMPLE ET PUISSANT. EXTENTION DE FONCTIONS P... par BlackWizzard
Source avec Zip PARSER FBML; COMMENT UTILISER DU CODE FBML (FACEBOOK) SANS P... par BlackWizzard
FICHIER XML => TABLEAU ASSOCIATIF par durealex
Source avec Zip Source avec une capture BASH CSVSQL: PARSER UN FICHIER CSV AVEC DES COMMANDES SQL par gentilKiki

Commentaires et avis

Commentaire de yoman64 le 29/07/2008 03:13:08

Salut,

Tu devrais sortir les count() et les sizeof() des boucles.

Commentaire de Ilsundal le 29/07/2008 09:06:31

Je vais défendre mon beefsteak, lol. Est-ce que le code ne vas pas être plus (trop?) chargé si je sort le sizeof() et les count() ? ou même l'exécution plus lente (à l'état atomique de la chose biensure) ?

Après, je pense que c'est surtout les habitudes de codage.

Commentaire de stailer le 29/07/2008 09:57:10

Ca va juste te rajouter au dessus de tes boucles :  
$nbTable = sizeof($Table);
for ....

Ca te fais une ligne de plus mais surtout, le total n'est pas recalculé à chaque passage. Car il me semble que c'est ce qu'il se passe si mes souvenirs sont bons...

Commentaire de codefalse le 29/07/2008 10:02:12 administrateur CS

En fait, sortir les fonctions count et sizeof des boucles permettent d'augmenter la rapidité d'éxécution de ton script. Quand tu as juste ton code ici préent qui est lancé, ce n'est pas un gros problème, mais s'il est appelé avec plusieurs autres scripts, ca va vite devenir gênant.

Sortir le maximum de fonction des boucles et une des règles de base de l'optimisation du code, chose à ne jamais négliger.

Par rapport à ton code, je l'aurai beaucoup plus apprécié en tant que classe. En effet, vu l'usage, ca aurait été sympa un truc du genre :

$obj = new GameLogParser ('./quake3.log');
echo 'Statistiques du joueur Ilsundal" :<br />';
echo 'Nombre de matchs gagnés :' . $obj->getWinnedMatches ('Ilsundal').'<br />';
...
etc :)

Voir jouer avec les méthodes magiques __get et __set, du genre $obj->Winner; te retourne le grand gagnant, à toi de voir comment tu implémente le tout ! :)

Commentaire de yoman64 le 30/07/2008 10:34:44

"Après, je pense que c'est surtout les habitudes de codage."

Oui, mais faut comprendre qu'il y a de meilleures habitudes que d'autre. Enfin, moi, j'ai l'habitude de chercher à faire un code optimisé avant tout. D'ailleurs je passe sans doute plus de temps à comparer/bencher des façons de faire que de coder à proprement dit, tout ça dans le but de sauver quelques cycles CPU.

Il est évident que sur ton code seul on ne ressentira pas la différence, mais quelques dix millièmes de seconde par ci par là, ça finit par donner des secondes. Et puis, le but principal d'un vrai programmeur, est d'avoir un code le plus optimisé possible. C'est sans doute la différence entre l'amateur et le vrai passionné(je ne dis pas professionnel, parce que tristement professionnel veut rarement dire compétent): Un veut simplement que ça fonctionne, l'autre veux que ça fonctionne, et que ça soit bien codé :P.

Le count, comme disait STAILER, est en effet calculer à chaque itération puisque la condition est comparé à chaque itération. Ça devient vite très lourd, surtout avec de gros tableaux. Le sortir de là va donc, forcément, sauver beaucoup de temps d'exécution.


D'ailleurs ça ne rajoute pas forcément une ligne, tu peux l'inclure dans la définition de la boucle.

for($i=0, $j=0; $i < count($Stats); $i++)

devient

for($i=0, $j=0, $cntStats = count($Stats); $i < $cntStats; $i++)



D'ailleurs beaucoup d'autres choses pouraient être améliorées:
#  $hFile = fopen($Fichier, "r");
# while(!feof($hFile))
# {
# $Log .= fgets($hFile);
# }
# fclose($hFile);

Pourrait utilisé file_get_contents, mais je ne comprends même pas pourquoi tu procède de cette façon, faire le traitement directement dans cette boucle serait BEAUCOUP plus rapide que de tout charger, et de le rediviser après. En fait ça permettrait de remplacer les lignes 23 à 58 par 5 ou 6 petites lignes.

Ensuite, tu sembles utiliser strstr pour savoir si une chaine est dans une autre. Si c'est le cas tu devrais utiliser strpos qui va être plus rapide pour l'usage que tu en fais.

Dans EffaceLog tu ne fermes pas le pointeur de fichier. Php le fait automatiquement à la fin du script, mais c'est une mauvaise habitude de pas fermer ses fichiers.

Voilà, garde à l'esprit que nous sommes sur codes-sources, et que tous ces commentaires ont pour but de t'aider à t'améliorer, non pas de dénigrer ton code ;p

Sinon l'idée de codefalse est intéressante, une classe serait sans doute sympatique :)

Commentaire de yoman64 le 30/07/2008 12:02:49

bon comme j'avais rien à faire (enfin, si, je devrais dormir, il est 6hr du mat ^^) j'ai fait un mini exemple pour prouver ce que je dis (parce que je sais par expérience que se faire dire que son code est pourris par quelqu'un qui propose pas mieux c'est très insultant)

Voilà, on pase de 90 à 28 lignes et de 1.65secondes à 0.35 pour 100 lectures et tri de games3.log (sur mon pc)

function LireLog($Fichier) {
$hFile = fopen($Fichier, "r");
while(!feof($hFile)) {
fscanf($hFile, '%d:%d score: %d ping: %d client: %d %[^$]s',$h,$m,$score,$ping,$client,$nom);
if ($nom !== null && $score !== null){
$Stats[$nom] += $score;
$nom=null;
$score = null;
}
}
fclose($hFile);
//Retourne le tableau
return $Stats;
}

function array_sort($array, $key) {
switch($key) {
case 'score':
arsort($array);
break;
case 'joueur':
$array = array_flip($array);
arsort($array);
$array = array_flip($array);
break;
}
  return $array;
}

PS: J'ai pris 10 minutes à faire ça, il peut encore être optimisé, mais pour moi c'est l'heure de dormir ;p

PPS: Si un admin croit que je pollue le sujet, libre à lui de supprimer mon post...

Commentaire de yoman64 le 30/07/2008 12:05:01

Bon, je suis lourd c'est vrai, mais CS a tout détruit ma belle indentation...
Voila le code plus clair: http://pastebin.org/58433

Sur ce, bonne journée à vous, et bonne nuit à moi :]

Commentaire de Ilsundal le 31/07/2008 09:05:54

wouahouu, ca c'est de l'optimisation !!! Merci, je vais prendre note de tous ça.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

parser un fichier doc en php [ par kayoo ] je n' arrive pas à parser un fichier de type word en php, le but est de réaliser un moteur de recherche sur le fichier .merci Parser xml en php [ par tahbre ] Bonjour à tous, Je dois accéder à un fichier xml qui est sur un autre site ftp que le mien, et je veux réaliser un parser en php de façon à stocker l parser xml [ par Nebraska ] bonjour,bon je débute salement en php; et j'ai besoin d'un parser xml. J'ai essayé ça mais bon ça marche pas :(Une bonne âme prèt a me dire ou je me s Parser overture [ par yvain91 ] Bonjour,J'aurai besoin, grace à une fonction php, de récupérer des résultats affichés sur la page d'overture de suggestion de mot clé(http://inventory parser une page web. [ par dezeque ] hello, j'aimerai savoir comment faire pour parser&nbsp;une page de requete google afin de sortir le nombre de resultat.DeZeQuE Cherche parser RSS 0.9 1.0 et 2.0 [ par olid ] Jour, Je cherche un tit script (ou une classe) ou un debut de source pour parser du RSS... Je veux juste recuperer les titres et URLs, ce qui est dej Au secours : comment parser un fichier xml et inserer a la volé dans une base mysql [ par deblok83 ] Bonjour, &nbsp;&nbsp;&nbsp; c'est mon premier post ici alors je me permet de me presenter je suis le webmaster de deblok83.com . j'ai un petit proble Parser une chaine de caractères [ par Suru_Verbal ] Bonjour &#224; tous,Quelle fonction utiliser s'il en existe une pour parser une chaine de caract&#232;res ?Merci d'avance ! Parser Flux XML afin de trouver une info [ par neoxdragon ] Salut, Ce que je souhaite faire c'est parser un XML de ce type: &lt;item&gt; &lt;id&gt;1&lt;/id&gt; &lt;name&gt;Nom1&lt;/name&gt; &lt;/item&gt; Flux WEBRANKINFO [ par malik7934 ] Hello,Aujourd'hui j'ai fait la douloureuse decouverte que je ne pouvais pas utiliser simple xml sur mon site.... je me suis donc empresse de demander


Nos sponsors


Sondage...

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,671 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales