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

PHP & Base de données Discussion :

probleme d'analyseur de fichier .log


Sujet :

PHP & Base de données

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Janvier 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 5
    Points : 1
    Points
    1
    Par défaut probleme d'analyseur de fichier .log
    Bonjour sous le cadre de mon PFE je doit developper une application web ( php) qui va analyser le fichier log de squid ( nommé acess.log) extraire le contenu nécessaire pour la supervision de l'accès internet et le mettre dans une BD mysql puis analyser le contenu de la page visiter et générer automatiquement une alert (ajout d'une alerte a la table alert ) , voila le code :


    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    <?
     
    require_once("../conf/conf.php");
     
    $fichier="access2.log";\\ le fichier a analyser
     
    //**** extraire le contenu nécessaire*******
     
    $do = fopen ($fichier, "r");
    $contenu = fread ($do, filesize ($fichier));
     
    $ligne = explode("\n", $contenu);
    $infoavant="vide";
    for ($i = 0; $i < (count($ligne)-1); $i++) {
    $info = split("[ ]+", $ligne[$i]);
     
    $infocourant=$info[2];
     
    if($infocourant!==$infoavant)
     
    {
    $date= $info[0];
    $adresse= $info[2];
    $http= $info[6];
    $dateheur=date('d-m-Y H:i:s',$date);
    $info2 = split("/", $http);
    $url=$info2[2];
    echo $http;
     
    /* -------Analyse du contenu  ----------*/
    $j=0;
    $resultat="";
    $trouve=0;
    //****************** recuperation des mot clé a recherché de la table keyword*********
     
    $req2="SELECT * FROM `keyword`";
    $data2=mysql_query($req2);   
     
       while($res2=mysql_fetch_array($data2))
    {
    //*************** analyse du page web visité*************************
    $fichierr = fopen($http,"r");
    while (!feof ($fichierr))
    {
    $donnees = strtolower(strip_tags(fgets($fichierr, 4096)));
    $pos = strpos($donnees, $res2["mot"]);
    if ($pos>0) $trouve=1;
    }//fin de la boucle
    if ($trouve==1)
    {
    $resultat.=$res2["mot"] ;
    $i++;
    }
    fclose($fichier);
    $trouve=0;
    }
     
     
     
     
           $sql="INSERT INTO `fichierlog` (`datevisite`, `adresseclub`, `adresseurl`,`urlvisited`,`keyword`) VALUES ('$dateheur', '$adresse', '$url','$http','$resultat');";
    $resut= mysql_query($sql);
    echo $sql;
     
     
    }
     
    $infoavant=$info[2];
    }
    header("Location:alertgenerator.php?); // redirection a la page alerte qui va générer des alerte selon le contenu de la table fichierlog
    ?>
    le problème c'est que le scripte tourne dans un boucle infinie et ne donnne plus de résultats , pouvez vous m'aider a resoudre se probleme ou si vous avez des proposition pour d'autre algorithme

    Exemlpe du fichier log a analyser

  2. #2
    Membre du Club
    Inscrit en
    Juillet 2004
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 74
    Points : 66
    Points
    66
    Par défaut
    Citation Envoyé par SUBARUu Voir le message
    le problème c'est que le scripte tourne dans un boucle infinie
    La quelle ?
    (sans indentation pas evident de lire le code)

    Sinon pourquoi incrémenter 2 fois ton $i (a 2 endroit different de ton code)? C'est normal (j'ai pas regardé plus en profondeur sans l'indentation c chiant )?

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Janvier 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Freyja Voir le message
    La quelle ?
    (sans indentation pas evident de lire le code)

    Sinon pourquoi incrémenter 2 fois ton $i (a 2 endroit different de ton code)? C'est normal (j'ai pas regardé plus en profondeur sans l'indentation c chiant )?
    just pour signaler que $fichier et la variable de l'adresse du fichier log et $fichierr est la variable qui contient l'adresse de la page visité ( extraction de cette adresse du fichier log ) donc je doit ouvrir la premiere boucle jusqu'a la fin du fichier log et pour chaque ligne du fichier log j'ouvre une boucle jusqu'& la fin du $fichierr qui va analyser le contenu ( trouver l'occurence des motclée déja sauvgardé dans la base de donné donc un autre boucle pour chaque motclé ) vous voyez 3 boucles successive , je pense qu'il y'a ne faute dans l'algorithme , vous avez une idée d'un autre algorithme qui permet d'analyser le contenu d'un fichier log et le contenu de chaque page visitée ?

  4. #4
    Membre du Club
    Inscrit en
    Juillet 2004
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 74
    Points : 66
    Points
    66
    Par défaut
    euh...

    Et ma question sur le $i alors ?? dsl c'est peut etre normal mais sur le coup j'ai trouvé ca étrange...
    Dans une boucle tu incrémente le $i, et dans ton autre boucle (for) tu l'incremente encore...
    A premiere vue, je ne vois pas l'utilité de l'incrementer...

    Apres je peux me tromper, j'ai du mal a lire un code sans une bonne indentation (et un minimum de commentaire)

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Janvier 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Freyja Voir le message
    euh...

    Et ma question sur le $i alors ?? dsl c'est peut etre normal mais sur le coup j'ai trouvé ca étrange...
    Dans une boucle tu incrémente le $i, et dans ton autre boucle (for) tu l'incremente encore...
    A premiere vue, je ne vois pas l'utilité de l'incrementer...

    Apres je peux me tromper, j'ai du mal a lire un code sans une bonne indentation (et un minimum de commentaire)
    vous avez raison alors voila j'ai changer un peus le code pour découper le processus , donc j'ai créer une page php nommé analyseur web , qui va analyser le contenu d'une page web pour trouver l'occurrence des mot clée stockeé dans la table " keyword" et ajouter les mot clée trouvé dans la table "fichierlog", voila le Code :
    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
    60
    61
    62
    63
    <?
     
    require_once("../conf/conf.php");
     
    // ouverture de la table "fichier log et selection des url qui n'ont pas étai verifié
     
     
     $req="SELECT * FROM `fichierlog` WHERE `flag`=0";
             $data=mysql_query($req);         
             while($res=mysql_fetch_array($data))
     
    {
     
    // ouverture de la table "keyword" pour selectionné les mot clée de test 
     
     
    $req2="SELECT * FROM `keyword`";
    $data2=mysql_query($req2);         
     
             while($res2=mysql_fetch_array($data2))
    {
     
     
    $resultat="";// la variable qui va contenir les mot clé trouvées 
     
    $fichier=$res["urlvisited"];// l'adresse url du fichier a analyser 
     
    // ouverture du fichier en mode "r" 
     
    $do = fopen ($fichier, "r");
    $contenu = fread ($do, filesize ($fichier));
     
    $ligne   = explode("\n", $contenu); // lecture du fichier ligne par ligne
    for ($i = 0; $i < (count($ligne)-1); $i++) 
     
     
    {
    $info = split("[ ]+", $ligne[$i]);// lecture de la ligne mot par mot en depassant le caractère espace 
     
    $infocourant=0;
     
    while ($ligne)// le test de la comparaison des mot commence 
       {
    $var1 = $res2["mot"];
    $var2 = $info["$infocourant"];
    if (strcasecmp($var1, $var2) == 0)
          {
             $resultat.=" ".$res2["mot"] ;// ajout du mot trouvé dans la variable $resultat 
          }
             $infocourant=0;
       }
     
    }
    fclose($fichier);
    }
     
    // mettre ajour la table "fichierlog" on ajoutant les mot trouvés et en mettant la valeur du flag =1 qui prouve que l'url est analysé
     
    $idivisit=$res["idvisite"];
    $requp="UPDATE `fichierlog` SET `keyword` = '$resultat', `flag` = '1' WHERE `idvisite` = '$idivisit' ";
    $dataup=mysql_query($req2);
    }
    ?>

    le probleme qu'il renvoi une erreur :
    Warning: filesize(): Stat failed for http://127.0.0.1/Ayman/lire_fichier.php (errno=2 - No such file or directory) in d:\program files\easyphp1-8\www\superviseur\dev\log\analyseurweb.php on line 25

    Warning: fread(): Length parameter must be greater than 0. in d:\program files\easyphp1-8\www\superviseur\dev\log\analyseurweb.php on line 25 ..


    donc vous voyez bien que le probleme reside dans la récupération du taille du fichier a analyser , alors es que vous avez une solution , merci bcp de votre aide

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Août 2002
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 194
    Points : 216
    Points
    216
    Par défaut
    Warning: filesize(): Stat failed for http://127.0.0.1/Ayman/lire_fichier.php (errno=2 - No such file or directory) in d:\program files\easyphp1-8\www\superviseur\dev\log\analyseurweb.php on line 25
    à vu de nez "No such file or directory" signifie qu'il ne trouve pas le fichier
    et donc forcément filesize ne renvoit rien donc 0...


    Warning: fread(): Length parameter must be greater than 0. in d:\program files\easyphp1-8\www\superviseur\dev\log\analyseurweb.php on line 25 ..
    Le "Length parameter must be greater than 0" signifie que la longueur doit être plus grande que 0...

    or comme précédement il a pas trouvé le fichier il a renvoyé 0 en longueur et donc ici ça ne marche pas...

    et si tu testes l'existence du fichier $fichier ça te donne quoi?
    Tout le monde savait que c'était impossible. Il est venu un imbécile qui ne le savait pas et qui l'a fait.
    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant.


    Spidercochon, spidercochon, il peut marcher au plafond
    ...MM ......Voici Spidercochon. Aidez le à conquérir le monde
    E(....)~....en le reproduisant.
    ...w

  7. #7
    Nouveau Candidat au Club
    Inscrit en
    Janvier 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Léortien Voir le message
    à vu de nez "No such file or directory" signifie qu'il ne trouve pas le fichier
    et donc forcément filesize ne renvoit rien donc 0...



    Le "Length parameter must be greater than 0" signifie que la longueur doit être plus grande que 0...

    or comme précédement il a pas trouvé le fichier il a renvoyé 0 en longueur et donc ici ça ne marche pas...

    et si tu testes l'existence du fichier $fichier ça te donne quoi?
    bon voila j'ai changer le Code pour l'optimiser , j'ai diminué le nombre des boucles et j'ai testé sur un fichier locale qui se trouve au même répertoire voila le nouveau code :

    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
    <?
    require_once("../conf/conf.php");
     $req="SELECT * FROM `fichierlog` WHERE `flag`=0"; //selection des lien non analyseés
    		   $data=mysql_query($req);		   
    		   while($res=mysql_fetch_array($data))
     
    {
     
    	$fichier="access2.log";// le fichier se trouve dans le meme repertoire
    	$do = fopen ($fichier, "rb");
    	while (!feof ($do))
    	{
    		$chaine= fgets($do,sizeof($do));
    		$reqs="SELECT * FROM `keyword` WHERE `mot` ='$chaine'"; // recherche de l'occurrence du mot clé 
    		$mp= mysql_fetch_row($reqs);
    		if($mb>0)
    			{ 
    				$idivisit=$res["idvisite"];
    				$requp="UPDATE `fichierlog` SET `keyword` = '$resultat' WHERE `idvisite` = '$idivisit' "; 	
    				$dataup=mysql_query($requp);	// mettre a jour la table fichierlog et ajout des mot clé trouvé 	
    			}
     
    	}fclose($do);
     
     	$requp2="UPDATE `fichierlog` SET `flag` = '1' WHERE `idvisite` = '$idivisit' "; 	
    	$dataup2=mysql_query($requp2);  // mettre a jour l'etat du lien 'analysé'
    }		
     
     
     
     
    ?>
    </body>
    le code me renvoie maintenant :
    Fatal error: Maximum execution time of 30 seconds exceeded in d:\program files\easyphp1-8\www\superviseur\dev\log\analyseurweb.php on line 39
    alors je crois que malgré que j'ai diminuer les boucle il tourne encore dans un boucle infinie ?

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Août 2002
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 194
    Points : 216
    Points
    216
    Par défaut
    Citation Envoyé par SUBARUu Voir le message
    alors je crois que malgré que j'ai diminuer les boucle il tourne encore dans un boucle infinie ?
    soit c'est trop long (ça m'est déjà arrivé, je lançais un script qui était juste trop long à exécuter et qui donc s'arrêtait avant la fin mais il n'y avait pas d'autres problèmes).
    et donc faut trouver alors une solution pour le raccourcir, le découper en plusieurs morceaux, (je ne sais pas si le lancer en ligne de commande peut changer quelquechose à la limite du temps d'exécution) ou changer de langage pour traiter les logs (certains analiseurs de logs, moteurs de recherche pour les sites web sont écrits en perl...)


    soit y'a une boucle infinie. pour vérifier si tu as une boucle infinie fait des echos un peu partout. des trucs du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    echo "entrée dans première boucle \n";
    echo "valeur en cours=".$xxxx."\n";
    echo "entrée dans deuxième boucle\n";
    echo "valeur en cours=".$xxxx."\n";
    echo "sortie deuxième boucle\n";
    echo "sortie première boucle\n";
    ça te permettra de voir si tu boucles quelquepart (tu verras la même valeur se répéter) ou si le déroulement de ton code est normal
    Tout le monde savait que c'était impossible. Il est venu un imbécile qui ne le savait pas et qui l'a fait.
    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant.


    Spidercochon, spidercochon, il peut marcher au plafond
    ...MM ......Voici Spidercochon. Aidez le à conquérir le monde
    E(....)~....en le reproduisant.
    ...w

  9. #9
    Membre du Club
    Inscrit en
    Juillet 2004
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 74
    Points : 66
    Points
    66
    Par défaut
    ou peut etre mettre une limite de temps plus important ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    init_set("max_execution_time",60); //60 secondes

  10. #10
    Nouveau Candidat au Club
    Inscrit en
    Janvier 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Léortien Voir le message
    soit c'est trop long (ça m'est déjà arrivé, je lançais un script qui était juste trop long à exécuter et qui donc s'arrêtait avant la fin mais il n'y avait pas d'autres problèmes).
    et donc faut trouver alors une solution pour le raccourcir, le découper en plusieurs morceaux, (je ne sais pas si le lancer en ligne de commande peut changer quelquechose à la limite du temps d'exécution) ou changer de langage pour traiter les logs (certains analiseurs de logs, moteurs de recherche pour les sites web sont écrits en perl...)

    soit y'a une boucle infinie. pour vérifier si tu as une boucle infinie fait des echos un peu partout. des trucs du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    echo "entrée dans première boucle \n";
    echo "valeur en cours=".$xxxx."\n";
    echo "entrée dans deuxième boucle\n";
    echo "valeur en cours=".$xxxx."\n";
    echo "sortie deuxième boucle\n";
    echo "sortie première boucle\n";
    ça te permettra de voir si tu boucles quelquepart (tu verras la même valeur se répéter) ou si le déroulement de ton code est normal
    le fichier tester ne contient que 2 ligne et la table des mot clé ne contient que 2 mot donc je pense qu'il y'a un boucle infinie , je vais tester est vous dire la resultat,
    merci infiniment les Amis

  11. #11
    Membre actif
    Profil pro
    Inscrit en
    Août 2002
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 194
    Points : 216
    Points
    216
    Par défaut
    oui je pensais avoir mis en option "rallonger le temps" mais je l'ai oublié...

    à mon corps défendant je rajoute que dans ce cas il faut savoir combien de temps ça peut durer au max
    tes logs sont forcément de taille variable en fonction du traffic du jour
    cette durée max est donc variable et faudrait la majorer très largement pour être sûr de ne jamais tomber sur un jour de traffic plus fort que d'habitude ou l'analyse sera coupée par la limite d'éxecution...

    le temps d'exécution serait un peu près fixe ce serait nickel, tu es dans un cas très très variable donc cette possibilité me fait plutot peur même si c'est sûrement la plus rapide et la plus simple de loin
    Tout le monde savait que c'était impossible. Il est venu un imbécile qui ne le savait pas et qui l'a fait.
    (\ _ /)
    (='.'=) Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant.


    Spidercochon, spidercochon, il peut marcher au plafond
    ...MM ......Voici Spidercochon. Aidez le à conquérir le monde
    E(....)~....en le reproduisant.
    ...w

Discussions similaires

  1. Problemes pour tronquer un fichier de Log
    Par toxycyty dans le forum Administration
    Réponses: 2
    Dernier message: 08/07/2009, 16h45
  2. probleme de fichier log corrompu - Ora-00314
    Par sanomory dans le forum Oracle
    Réponses: 2
    Dernier message: 14/02/2008, 09h58
  3. probleme fichier log du squid
    Par nizar_insat dans le forum Réseau
    Réponses: 4
    Dernier message: 05/11/2007, 00h38
  4. ajout erreur fichier log dans la boite Problems d'eclipse
    Par alister dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 07/08/2007, 09h34
  5. analyseur fichier .log
    Par shintoisme dans le forum Windows Serveur
    Réponses: 1
    Dernier message: 21/06/2006, 21h27

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