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

Langage PHP Discussion :

Parsing de fichier et split de résultat. [PHP 5.3]


Sujet :

Langage PHP

  1. #1
    Membre éclairé
    Avatar de ArKam
    Inscrit en
    Mars 2007
    Messages
    528
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mars 2007
    Messages : 528
    Points : 679
    Points
    679
    Par défaut Parsing de fichier et split de résultat.
    Bien le bonjour à tous, voila, je reviens vers vous, car je patauge avec un de mes scripts.

    Le script est tout con, il ne fait pas grand-chose:

    1°/-Vérifier la présence d'un fichier.
    2°/-Ouvrir le fichier.
    3°/-Lire chaque ligne.
    4°/-eclater chaque ligne grâce à preg_split (le pattern etant un espace).
    5°/-Prendre chaque ligne et l'envoyer en BDD en faisant en sorte que chaque partie éclatée correspondent à un champs dans la table donnée.

    Voici ce que je fais pour l'instant:

    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
     
    <?php
     
    function logsparsing(){
     
    	// Déclaration du pattern preg_split //
     
    $pattern = "/\s/"; //On recherche les espaces dans la chaine soumise.//
     
    	// Ouverture du fichier de log	//
     
    $access_log = "/srv/www/squid/content/access.log"; //fichier à lire //
     
    if (is_readable($access_log)) { //test du fichier, possible à ouvrir ou pas.//
    echo "File is readable!";
    $readlog = fopen($access_log,"r+"); //On ouvre le fichier.//
     
    	while (!feof($readlog)) //Boucle jusqu'à l'arrivé en fin de fichier.//
    	{
    		$linesreadlog = fgets($readlog);// On lit le fichier en déplaceant le pointeur ligne par ligne tout en mettant la valeur du pointeur en variable.//
    		foreach($linesreadlog as $linereaded) {
    			$keywords = preg_split($pattern,$linereaded);
    			print_r($keywords);	
    		}
    	}
     
    fclose($access_log);
     
    } 
     
    else {
    	echo "Error - The file can't be read.";	
    }
     
    }
     
    logsparsing();
     
    ?>
    Mon souci ici, c'est le foreach, je n'arrive pas à faire en sorte qu'il me sorte un tableau de la forme:

    array ( [0] = 1320.516, [1] = GET, [2] = http://url.com etc);

    j'ai donc tenté d'afficher le resultat de keywords mais j'ai une erreur sur l'utilisation de foreache, je sais que celui-ci n'accepte en entrée que des tableau apparement, mais fgets ne sort pas de tableau, et l'utilisation de file(); ne fonctionne pas plus.

    Merci de votre aide par avance

  2. #2
    Membre éclairé
    Avatar de ArKam
    Inscrit en
    Mars 2007
    Messages
    528
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mars 2007
    Messages : 528
    Points : 679
    Points
    679
    Par défaut
    Bien, pour infos j'ai contourné mon problème de façon plutôt barbare

    mais j'ai encore un souci, à savoir que le fichier que je parse, contient des espaces et des retours à la lignes.

    Le hic c'est que juste après, je fais un preg_split qui viens donc me splitter toutes les string contenues entre ces espaces (grâce à \s+) et donc, je me retrouve avec un tableau de ce type là:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Array(
    [0]=>1300809100.513
    [1]=>TCP_MISS/200
    ...
    [9]=>application/x-jav
    [10]=>ascript
    )
    au lieu de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Array(
    [0]=>1300809100.513
    [1]=>TCP_MISS/200
    ...
    [9]=>application/x-javascript
    )
    Sachant que ce n'est pas moi qui génère le fichier de log mais un logiciel tierce, je ne peux pas modifier la façon dont le fichier est crée.

    Je ne sais pas trop comment éviter ce genre de soucis

    PS: Pour ceux que ça interessent, voici comment j'ai fais pour le foreach:

    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
     
    <?php
     
    function logsparsing(){
     
    	// Déclaration du pattern preg_split //
     
    $pattern = "/\s+/"; //On recherche les espaces dans la chaine soumise.//
     
    	// Ouverture du fichier de log	//
     
    $access_log = "/srv/www/lisquid/content/access.log"; //fichier à lire //
     
    if (is_readable($access_log)) { //test du fichier, possible à ouvrir ou pas.//
    echo "File is readable!"."<br>";
    $readlog = fopen($access_log,"r+"); //On ouvre le fichier et on met le pointeur de fichier dans une variable.//
     
    	while (!feof($readlog)) //Boucle jusqu'à l'arrivé en fin de fichier.//
    	{
    		$linesreadlog = array(fgets($readlog));// On lit le fichier en déplaceant le pointeur ligne par ligne tout en mettant la valeur du pointeur en tableau.//
    		foreach($linesreadlog as $linereaded) {
    			$keywords = preg_split($pattern,$linereaded,0,PREG_SPLIT_NO_EMPTY);
    			print_r($keywords);
    			echo "<p></p>";
    		}
    	}
     
    } 
     
    else {
    	echo "Error - The file can't be read.";	
    }
     
    }
     
    logsparsing();
     
    ?>

  3. #3
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Voici une solution plus simple:

    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
     
    <?php
     
    $stmt = $pdo->prepare('INSERT INTO table (a,b,c) VALUES (:a,:b,:c)');
    $res = array();
     
    $file = new SplFileObject("mon_fichier.txt","r");
    $file->setFlags(SplFileObject::READ_CSV);
    $file->setCsvControl(' ');
    foreach ($file as $line) {
    	list($a,$b,$c) = $line;
    	$res[] = $stmt->execute(':a' => $a, ':b' => $b, ':c' => $c);
    }
     
    echo "Success : " . count(array_keys($res, true, true));
    echo "Failures : " . count(array_keys($res, false, true));

  4. #4
    Membre éclairé
    Avatar de ArKam
    Inscrit en
    Mars 2007
    Messages
    528
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mars 2007
    Messages : 528
    Points : 679
    Points
    679
    Par défaut
    Merci de ton aide,

    Donc si je comprend bien ton exemple, je créer un nouvel objet de gestion de fichier que tu nomme $file et auquel tu défini des propriétés:

    Lire le fichier en tant que CSVFile.
    Le caractère de séparation étant l'espace.

    Ensuite, je ne comprend pas pourquoi tu utilise liste au lieu de array?

    Pareil, pourquoi je ne trouve pas les fonctions suivantes chez php.net?

    Execute(); et Prepare();

    Merci de ton aide en tous cas.

    EDIT: OK donc de ce que j'ai trouvé exec() et prepare() sont des méthodes de la classe PDOStatement? c'est bien ça?

    Dans ce cas, n'aurais-tu pas oublié un $kekchose = new pdo($dsn,$username...);?

  5. #5
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    L'instruction "list" permet de setter plusieurs variables à la fois en utilisant un tableau, chaque offset du tableau est mis dans la variable de même position dans la liste.
    Voir: http://php.net/manual/en/function.list.php

    execute et prepare font ici référence aux méthodes PDOStatement::execute et PDO::prepare de PDO. Cela permet de créer une requête préparée au niveau de mysql afin de dissocier les traitements des données (sécurité) et d'accélérer les transferts en n'envoyant au travers d'execute uniquement les données utiles et non pas la requête entière.
    Voir: http://julp.developpez.com/php/pdo/?#sommaire

  6. #6
    Membre éclairé
    Avatar de ArKam
    Inscrit en
    Mars 2007
    Messages
    528
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mars 2007
    Messages : 528
    Points : 679
    Points
    679
    Par défaut
    Merci à toi pour les infos, je vais bûcher ça

    En fait, je ne savais pas que comme pour les fonctions, php fournissait des classes internes au language.

    Je vais regarder un peu plus, c'est dommage que comme pour la function_list ils ne fournissent pas une Classes_list pour la recherche.

    Sinon, concernant ma question de création de ton objet PDO?
    Pour rappel:
    exec() et prepare() sont des méthodes de la classe PDOStatement? c'est bien ça?

    Dans ce cas, n'aurais-tu pas oublié un $kekchose = new pdo($dsn,$username...);?
    Bref, beaucoup d'infos aujourd'hui, je vais voir pour assimiler ça, tester sur mon script et revenir vers toi dans la semaine si je bloque

  7. #7
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Si, tu as la documentation des classes du langages:
    - SPL: http://www.php.net/manual/en/book.spl.php (FileObject en fait partie)
    - PDO: http://www.php.net/manual/en/book.pdo.php

    Dans ce cas, n'aurais-tu pas oublié un $kekchose = new pdo($dsn,$username...);?
    Mon exemple n'est certes pas complet.

    Voici comment instancier un PDO:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $db = "backoffice";
    $db_type = "mysql";
    $db_user = "root";
    $db_password = "";
    $db_host = "localhost";
     
    $pdo = new PDO("$db_type:dbname=$db;host=$db_host", $db_user, $db_password);
    Par exemple. On mets généralement l'instance unique de PDO dans un Singleton, une recherche sur le forum te donnera nombre de tutos sur la question.

  8. #8
    Membre éclairé
    Avatar de ArKam
    Inscrit en
    Mars 2007
    Messages
    528
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mars 2007
    Messages : 528
    Points : 679
    Points
    679
    Par défaut
    Donc, j'ai travaillé sur ce que tu m'as donné, mais j'ai encore un petit souci.

    Voici mon 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
     
    <?php
    	// - LOG PROCESSING AND DATABASE PROVISIONING - //
     
    function logparse() {
     
    	// - LOGFILE PARSING AND PROCESSING - //
    $squidlogfile = "/srv/www/squid/content/access.log";
     
    switch (is_readable($squidlogfile)) {
     
    	case true:
    			$parsedfile = new SplFileObject("$squidlogfile","r");
    			$parsedfile->setFlags(SplFileObject::READ_CSV);
    			$parsedfile->setFlags(SplFileObject::SKIP_EMPTY);
    			$parsedfile->setCsvControl(' ');
    				while(!$parsedfile->eof()){
    					print_r ($parsedfile->fgetcsv());
    				}
    			break;
     
    	case false:
    			echo "the file $squidlogfile is not readable:"."<br>";
    			break;
    }
     
    }
     
    logparse();
     
    ?>
    En gros, l'objet fait bien ce que je lui demande, à une exception prés:

    Je veux que SplFileObject m’enlève tous les espaces afin de ne récupérer que les strings qui m’intéresses.

    Hors la, il fait bien le job pour le premier espace, mais pas pour les suivants.
    C'est à dire que lorsqu'il trouve une tabulation horizontale ou plusieurs espaces l'un après l'autres, il me met ces espaces dans le tableau résultant, ce qui n'est pas correct.

    Voici ce que j'obtiens:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Array ( 
    [0] => 1300809100.513 
    [1] => 
    [2] => 
    [3] => 1057 
    [4] =>
    ...
    [n] => espace ou string
    et Voici ce que je veux obtenir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Array (
    [0] => 1300809100.513 
    [3] => 1057 
    ...
    [n]=>String uniquement.
    Je me demande si on peux passer des regex à la méthode setCsvControl de l'objet créer?

    A savoir qu'avec la fonction preg_split quand je lui passe l'argument PREG_SPLIT_NO_EMPTY il vire les espaces et tout autres valeurs vide.

    C'est possible de faire pareil?

  9. #9
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Tu vas devoir extraire les données à la main.

    Tu peux faire comme ça je pense:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $parsedfile = new SplFileObject((string)$squidlogfile,"r");
    $parsedfile->setFlags(SplFileObject::SKIP_EMPTY);
    while(!$parsedfile->eof()){
      var_dump(preg_split('#[[:space:]]+#', trim($parsedfile->fgets()));
    }
    Dommage que tu n'aies pas pu utiliser le contrôle CSV.

  10. #10
    Membre éclairé
    Avatar de ArKam
    Inscrit en
    Mars 2007
    Messages
    528
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mars 2007
    Messages : 528
    Points : 679
    Points
    679
    Par défaut
    Benjamin, merci de ton aide sur ce problème.

    Entre temps, j'ai un peu avancé, mais je bloque maintenant avec la fonction list() qui me sort des données assez invraisemblables.

    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
     
    <?php
    	// - LOG PROCESSING AND DATABASE PROVISIONING - //
     
    function logparse() {
     
    	// - DATABASE CONNECTION AND PROVISIONING - //
    $squiddbconf="/srv/www/squid/config/squidconf.ini";
    $db_conf = parse_ini_file($squiddbconf);
    $db_driver = $db_conf['db_driver'];
    $db_host = $db_conf['db_host'];
    $db_port = $db_conf['db_port'];
    $db_name = $db_conf['db_name'];
    $db_user = $db_conf['db_user'];
    $db_password = $db_conf['db_password'];
    $db_source = "$db_driver".":"."$db_host".";"."$db_name";
    $db_table = 'access_log';
    $db_insert = "INSERT INTO $db_table (timestamp,elapsed,client,action,size,method,url,ident,hierarchy,content) VALUES ($timestamp,$duration,$client,$result_code,$size,$request_method,$url,$ident_lookup,$hierarchy_code,$type)";
     
    $db_object = new PDO($db_source, $db_user, $db_password);
     
    switch (is_readable($squiddbconf)) {
     
    	case true:
    			echo "This file is readable"."<br>";
    			echo "$db_source";
    			break;
     
    	case false:
    			echo "this file is not readable:"."<br>";
    			break;
    }
     
    	// - LOGFILE PARSING AND PROCESSING - //
    $squidlogfile = "/srv/www/squid/content/access.log";
    $pattern = "/\s+/";
     
    switch (is_readable($squidlogfile)) {
     
    	case true:
    			$parsedfile = new SplFileObject("$squidlogfile","r");
    				while(!$parsedfile->eof()){
    					$lineread = $parsedfile->fgets();
    					$linesplit = preg_split($pattern,$lineread,10,PREG_SPLIT_NO_EMPTY);
    						foreach ($linesplit as $index){
    							list($timestamp,$duration,$client,$result_code,$size,$request_method,$url,$ident_lookup,$hierarchy_code,$type) = $index;
    							print_r($timestamp);
    						}
    				}
    			break;
     
    	case false:
    			echo "the file $squidlogfile is not readable:"."<br>";
    			break;
    }
     
    }
     
    logparse();
     
    ?>
    Normalement ma fonction print_r($timestamp);
    devrait me sortir quelque chose comme:

    1300809100.513
    1300809106.445
    sans les retours à la ligne of course.
    Par contre moi là j'ai un bon gros charabia de ce style:

    111T1Gh-Hi121T1Gh-Hi101T2Gh-Ht111T3Gh-Ht131T3Gh-Ht131T3Gh-Ht151T2Gh-Hi151T5Gh-Ht101T7Gh-Ha111T1Gh-Hi121T6Gh-Ht141T9Gh-Ht191T7Gh-Ht181T2Gh-Ht101T2Gh-Ha141T3Gh-Hi101T7Gh-Hi101T2Gh-Ha
    sur une seul ligne bien entendu

    Donc, je ne comprend pas ce qu'il se passe avec la fonction list.
    J'ai beau regarder la doc php et faire des test sur du code simple, je n'obtient pas le résultat attendu.


  11. #11
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Encore une fois list n'est pas une fonction mais un mot clé comme array par exemple, c'est d'ailleurs son pendant

    Pour pouvoir répondre à ta question j'aurais besoin que tu me mettes un var_dump de la variable $index dans ton foreach.

    Ce qui m'étonne c'est que tu mettes ce foreach dans la bouche while, je peux voir un extrait du log squid stp ?

  12. #12
    Membre éclairé
    Avatar de ArKam
    Inscrit en
    Mars 2007
    Messages
    528
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mars 2007
    Messages : 528
    Points : 679
    Points
    679
    Par défaut
    Bon, je crois que je vais devenir dingue, lorsque je sort un var_dump de $index, dans la boucle foreach, que ce soit avant ou bien après le mot clé list(), j'ai bien un resultat cohérent avec ce que j'attend, à savoir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    string(14) "1300809100.513" string(4) "1057" string(14) "192.168.221.63" string(12) "TCP_MISS/200" string(5) "14454" string(3) "GET" string(66) "http://www2.mediadirect.ro/widgets/thumb-realitatea/thumbnail.jpg?" string(1) "-" string(25) "HIER_DIRECT/178.21.120.30" string(11) "image/jpeg " string(14) "1300809106.445" string(3) "243" string(14) "192.168.221.63" string(12) "TCP_MISS/200" string(5) "14454" string(3) "GET" string(66) "http://www2.mediadirect.ro/widgets/thumb-realitatea/thumbnail.jpg?" string(1) "-" string(25) "HIER_DIRECT/178.21.120.30" string(11) "image/jpeg " string(14) "1300809420.089" string(1) "0" string(14) "192.168.221.63" string(15) "TCP_MEM_HIT/200" string(3) "289" string(3) "GET" string(38) "http://stats.hvsdigital.com/stats.htm?" string(1) "-" string(11) "HIER_NONE/-" string(10) "text/html " string(14) "1300890256.825" string(3) "101" string(14) "192.168.221.66" string(12) "TCP_MISS/503" string(4) "3118" string(3) "GET" string(17) "http://10.30.2.3/" string(1) "-" string(21) "HIER_DIRECT/10.30.2.3" string(10) "text/html " string(14) "1300896123.297" string(2) "34" string(14) "192.168.221.66" string(12) "TCP_MISS/204" string(3) "307" string(3) "GET" string(25) "http://www.google.fr/csi?" string(1) "-" string(25) "HIER_DIRECT/74.125.230.82" string(10) "text/html " string(14) "1300896512.713" string(2) "34" string(14) "192.168.221.66" string(26) "TCP_REFRESH_UNMODIFIED/304" string(3) "384" string(3) "GET" string(39) "http://www.lemonde.fr/expedia/proxy.xml" string(1) "-" string(24) "HIER_DIRECT/77.67.20.145" string(9) "text/xml " string(14) "1300896513.232" string(3) "500" string(14) "192.168.221.66" string(24) "TCP_REFRESH_MODIFIED/200" string(5) "26048" string(3) "GET" string(44) "http://www.sytadin.fr/raster/segment_IDF.gif" string(1) "-" string(25) "HIER_DIRECT/83.206.157.61" string(10) "image/gif " string(14) "1300899468.217" string(3) "542" string(14) "192.168.221.66" string(12) "TCP_MISS/301" string(3) "579" string(3) "GET" string(45) "http://whatismyip.com/images/changeyourip.gif" string(1) "-" string(25) "HIER_DIRECT/72.233.89.198" string(10) "text/html " string(14) "1300955283.478" string(1) "0" string(14) "192.168.221.66" string(15) "TCP_MEM_HIT/200" string(3) "715" string(3) "GET" string(43) "http://wwwstatic.megavideo.com/ad_image.swf" string(1) "-" string(11) "HIER_NONE/-" string(30) "application/x-shockwave-flash " string(14) "1300955319.774" string(4) "1922" string(14) "192.168.221.66" string(12) "TCP_MISS/206" string(6) "114821" string(3) "GET" string(60) "http://www.kazeo.com/sites/fr/photos/185/photo-1857394-L.jpg" string(1) "-" string(25) "HIER_DIRECT/195.60.188.31" string(11) "image/jpeg " string(14) "1300955659.648" string(2) "28" string(14) "192.168.221.66" string(12) "TCP_MISS/404" string(3) "624" string(3) "GET" string(66) "http://www.unixgarden.com/wp-content/themes/unixgarden_v2/lexus.js" string(1) "-" string(24) "HIER_DIRECT/94.23.37.165" string(10) "text/html " string(14) "1300957746.461" string(2) "41" string(14) "192.168.221.66" string(27) "TCP_CLIENT_REFRESH_MISS/200" string(3) "914" string(3) "GET" string(53) "http://novavision.studio.free.fr/unicore/css/body.css" string(1) "-" string(25) "HIER_DIRECT/212.27.63.149" string(9) "text/css " string(14) "1300960389.783" string(2) "93" string(14) "192.168.221.83" string(12) "TCP_MISS/301" string(3) "701" string(3) "GET" string(20) "http://www.yahoo.fr/" string(1) "-" string(26) "HIER_DIRECT/77.238.178.122" string(10) "text/html " string(14) "1300960390.625" string(1) "8" string(14) "192.168.221.83" string(15) "TCP_MEM_HIT/200" string(5) "27623" string(3) "GET" string(26) "http://l.yimg.com/a/combo?" string(1) "-" string(11) "HIER_NONE/-" string(9) "text/css " string(14) "1300960601.607" string(1) "0" string(14) "192.168.221.77" string(15) "TCP_IMS_HIT/304" string(3) "251" string(3) "GET" string(77) "http://mobile.orange.fr/content/ge/high/v2_javascript/nav_boutiques_orange.js" string(1) "-" string(11) "HIER_NONE/-" string(25) "application/x-javascript " string(14) "1300961990.279" string(2) "43" string(14) "192.168.221.63" string(12) "TCP_MISS/200" string(4) "3058" string(3) "GET" string(78) "http://s1.lemde.fr/medias/www/1.2.416/img/partenaires/lepost/le_post_71x17.png" string(1) "-" string(24) "HIER_DIRECT/94.127.72.80" string(10) "image/png " string(14) "1300961990.951" string(1) "0" string(14) "192.168.221.63" string(11) "TCP_HIT/200" string(3) "732" string(3) "GET" string(131) "http://a1692.g.akamai.net/n/1692/2042/1077898746/pubs.lemonde.fr/RealMedia/ads/Creatives/OasDefault/publicite/titleBar_pub330_4.gif" string(1) "-" string(11) "HIER_NONE/-" string(10) "image/gif " string(14) "1300962680.554" string(1) "0" string(14) "192.168.221.63" string(15) "TCP_IMS_HIT/304" string(3) "253" string(3) "GET" string(50) "http://www.lemonde.fr/services/services_abonnes.js" string(1) "-" string(11) "HIER_NONE/-" string(25) "application/x-javascript "
    Pour ce qui est des logs squid:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    1300809100.513   1057 192.168.221.63 TCP_MISS/200 14454 GET http://www2.mediadirect.ro/widgets/thumb-realitatea/thumbnail.jpg? - HIER_DIRECT/178.21.120.30 image/jpeg
    1300809106.445    243 192.168.221.63 TCP_MISS/200 14454 GET http://www2.mediadirect.ro/widgets/thumb-realitatea/thumbnail.jpg? - HIER_DIRECT/178.21.120.30 image/jpeg
    1300809420.089      0 192.168.221.63 TCP_MEM_HIT/200 289 GET http://stats.hvsdigital.com/stats.htm? - HIER_NONE/- text/html
    1300890256.825    101 192.168.221.66 TCP_MISS/503 3118 GET http://10.30.2.3/ - HIER_DIRECT/10.30.2.3 text/html
    1300896123.297     34 192.168.221.66 TCP_MISS/204 307 GET http://www.google.fr/csi? - HIER_DIRECT/74.125.230.82 text/html
    1300896512.713     34 192.168.221.66 TCP_REFRESH_UNMODIFIED/304 384 GET http://www.lemonde.fr/expedia/proxy.xml - HIER_DIRECT/77.67.20.145 text/xml
    1300896513.232    500 192.168.221.66 TCP_REFRESH_MODIFIED/200 26048 GET http://www.sytadin.fr/raster/segment_IDF.gif - HIER_DIRECT/83.206.157.61 image/gif
    1300899468.217    542 192.168.221.66 TCP_MISS/301 579 GET http://whatismyip.com/images/changeyourip.gif - HIER_DIRECT/72.233.89.198 text/html
    1300955283.478      0 192.168.221.66 TCP_MEM_HIT/200 715 GET http://wwwstatic.megavideo.com/ad_image.swf - HIER_NONE/- application/x-shockwave-flash
    1300955319.774   1922 192.168.221.66 TCP_MISS/206 114821 GET http://www.kazeo.com/sites/fr/photos/185/photo-1857394-L.jpg - HIER_DIRECT/195.60.188.31 image/jpeg
    voici ce qui se répète dans le fichier, sur 280Mo

  13. #13
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Là y'a quelque chose qui m'échape. Essaie un bon vieux var_dump($index[0]); histoire de rire.

  14. #14
    Membre éclairé
    Avatar de ArKam
    Inscrit en
    Mars 2007
    Messages
    528
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mars 2007
    Messages : 528
    Points : 679
    Points
    679
    Par défaut
    Je viens de faire le var_dump et voici le résultat:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    string(1) "1" string(1) "1" string(1) "1" string(1) "T" string(1) "1" string(1) "G" string(1) "h" string(1) "-" string(1) "H" string(1) "i" string(1) "1" string(1) "2" string(1) "1" string(1) "T" string(1) "1" string(1) "G" string(1) "h" string(1) "-" string(1) "H" string(1) "i" string(1) "1" string(1) "0" string(1) "1" string(1) "T" string(1) "2" string(1) "G" string(1) "h" string(1) "-" string(1) "H" string(1) "t" string(1) "1" string(1) "1" string(1) "1" string(1) "T" string(1) "3" string(1) "G" string(1) "h" string(1) "-" string(1) "H" string(1) "t" string(1) "1" string(1) "3" string(1) "1" string(1) "T" string(1) "3" string(1) "G" string(1) "h" string(1) "-" string(1) "H" string(1) "t" string(1) "1" string(1) "3" string(1) "1" string(1) "T" string(1) "3" string(1) "G" string(1) "h" string(1) "-" string(1) "H" string(1) "t" string(1) "1" string(1) "5" string(1) "1" string(1) "T" string(1) "2" string(1) "G" string(1) "h" string(1) "-" string(1) "H" string(1) "i" string(1) "1" string(1) "5" string(1) "1" string(1) "T" string(1) "5" string(1) "G" string(1) "h" string(1) "-" string(1) "H" string(1) "t" string(1) "1" string(1) "0" string(1) "1" string(1) "T" string(1) "7" string(1) "G" string(1) "h" string(1) "-" string(1) "H" string(1) "a" string(1) "1" string(1) "1" string(1) "1" string(1) "T" string(1) "1" string(1) "G" string(1) "h" string(1) "-" string(1) "H" string(1) "i" string(1) "1" string(1) "2" string(1) "1" string(1) "T" string(1) "6" string(1) "G" string(1) "h" string(1) "-" string(1) "H" string(1) "t" string(1) "1" string(1) "4" string(1) "1" string(1) "T" string(1) "9" string(1) "G" string(1) "h" string(1) "-" string(1) "H" string(1) "t" string(1) "1" string(1) "9" string(1) "1" string(1) "T" string(1) "7" string(1) "G" string(1) "h" string(1) "-" string(1) "H" string(1) "t" string(1) "1" string(1) "8" string(1) "1" string(1) "T" string(1) "2" string(1) "G" string(1) "h" string(1) "-" string(1) "H" string(1) "t" string(1) "1" string(1) "0" string(1) "1" string(1) "T" string(1) "2" string(1) "G" string(1) "h" string(1) "-" string(1) "H" string(1) "a" string(1) "1" string(1) "4" string(1) "1" string(1) "T" string(1) "3" string(1) "G" string(1) "h" string(1) "-" string(1) "H" string(1) "i" string(1) "1" string(1) "0" string(1) "1" string(1) "T" string(1) "7" string(1) "G" string(1) "h" string(1) "-" string(1) "H" string(1) "i" string(1) "1" string(1) "0" string(1) "1" string(1) "T" string(1) "2" string(1) "G" string(1) "h" string(1) "-" string(1) "H" string(1) "a"
    C'est drôle parce que ce sont exactement les valeurs de $timestamp, mais par contre, je ne sais absolument pas d'ou il prend ces valeurs Oo.

    Enfin si, ce sont des morceaux de la string splité, mais l'indexage est étrange, il ne prend en index 0 que le premier octet de chaque string.

    Genre pour les deux premieres entrées:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    string(1)300809100.513   string(1)057 192.168.221.63 string(T)CP_MISS/200 string(1)4454 string(G)ET string(h)ttp://www2.mediadirect.ro/widgets/thumb-realitatea/thumbnail.jpg? string(-) string(H)IER_DIRECT/178.21.120.30 string(i)mage/jpeg
     
    &
     
    string(1)300809106.445    string(2)43 string(1)92.168.221.63 string(T)CP_MISS/200 string(1)4454 string(G)ET string(h)ttp://www2.mediadirect.ro/widgets/thumb-realitatea/thumbnail.jpg? string(-) string(H)IER_DIRECT/178.21.120.30 string(i)mage/jpeg
    C'est ... étrange, il me semble qu'il y'a trop de tableau de sortie en fait.

  15. #15
    Membre éclairé
    Avatar de ArKam
    Inscrit en
    Mars 2007
    Messages
    528
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mars 2007
    Messages : 528
    Points : 679
    Points
    679
    Par défaut
    OK ALLELUIA, j'ai trouvé

    En fait, le foreach est de trop, en effet, le while traite déjà ligne par ligne et genere un tableau de type:

    C'est donc sur ce tableau que je doit traiter les index, et comme je suis déjà dans une boucle, le foreach est inutile car sinon il index l'index du premier tableau d'ou les sortie uniquement sur les premières string de chaque partie.

    Je sais pas si je suis trés clair sur l'explication XD

    Donc maintenant j'ai un code bien plus propre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    			$parsedfile = new SplFileObject("$squidlogfile","r");
    				while(!$parsedfile->eof()){
    					$lineread = $parsedfile->fgets();
    					$linesplit = preg_split($pattern,$lineread,10,PREG_SPLIT_NO_EMPTY); //Est-un tableau contenant le fichier parsé ex [0]=>1353315988.513 & [1]=>1057 etc.
    					list($timestamp,$duration,$client_address,$result_codes,$size,$request_method,$url,$ident_lookup,$hierarchy_code,$type) = $linesplit;
    				}
    Et là, j'ai bien les valeurs attendue correct dans chaque variables de List().

    Maintenant, je m'attaque à la partie, envoie en BDD, je ne clôt donc pas tout de suite le sujet.

    Je clôturerais dés que j'aurais fini complètement, ça donnera un exemple de parsing et envoie des données.

    Un GRAND merci pour ton aide Benjamin.

  16. #16
    Membre éclairé
    Avatar de ArKam
    Inscrit en
    Mars 2007
    Messages
    528
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mars 2007
    Messages : 528
    Points : 679
    Points
    679
    Par défaut
    Bon bah comme fallait bien finir par une petite erreur.

    Tous mon script semble fonctionner, MAIS rien n'arrive en BDD.
    Si je test les exceptions renvoyées WALOU, j'ai pas une seul erreur retourné.

    J'ai comme l'impression que j'ai manqué quelque chose.

    Voici le contenu d'un var_dump de mon objet:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    object(PDOStatement)#2 (1) { ["queryString"]=> string(218) "INSERT INTO access_log (timestamp,elapsed,client,action,size,method,url,ident,hierarchy,content) VALUES (:timestamp,:duration,:client_address,:result_code,:size,:request_method,:url,:ident_lookup,:hierarchy_code,:type)" }
    Voici mon 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
     
    function logparse() {
     
    	// - DATABASE INFOTMATIONS - //
    $squiddbconf="/srv/www/squid/config/squidconf.ini";
    switch (is_readable($squiddbconf)) {
     
    	case true:
    			$db_conf = parse_ini_file($squiddbconf);
    			$db_driver = $db_conf['db_driver'];
    			$db_host = $db_conf['db_host'];
    			$db_port = $db_conf['db_port'];
    			$db_name = $db_conf['db_name'];
    			$db_user = $db_conf['db_user'];
    			$db_password = $db_conf['db_password'];
    			$db_source = "$db_driver".":"."$db_host".";"."$db_name";
    			$db_table = 'access_log';
    			$db_insert = "INSERT INTO $db_table (timestamp,elapsed,client,action,size,method,url,ident,hierarchy,content) VALUES (:timestamp,:duration,:client_address,:result_code,:size,:request_method,:url,:ident_lookup,:hierarchy_code,:type)";
    			break;
     
    	case false:
    			echo "this file is not readable:"."<br>";
    			break;
    }
     
    	// - LOGFILE PARSING AND PROCESSING - //
    $squidlogfile = "/srv/www/lisquid/content/access.log";
    $pattern = "/\s+/";
     
    switch (is_readable($squidlogfile)) {
     
    	case true:
    		try{
        		$db_object = new PDO($db_source, $db_user, $db_password);
    			$db_request = $db_object->prepare($db_insert);
    		}catch(PDOException $error){
    			echo 'Exception PDO Reçue: ', $error->getMessage(), "\n";
    		}
    			$parsedfile = new SplFileObject("$squidlogfile","r");
     
    				while(!$parsedfile->eof()){
    					$lineread = $parsedfile->fgets();
    					$linesplit = preg_split($pattern,$lineread,10,PREG_SPLIT_NO_EMPTY); //Est-un tableau contenant le fichier parsé ex [0]=>1353315988.513 & [1]=>1057 etc.
     
    					list($timestamp,$duration,$client_address,$result_codes,$size,$request_method,$url,$ident_lookup,$hierarchy_code,$type) = $linesplit;
     
    					$db_request->bindParam(':timestamp',$timestamp);
    					$db_request->bindParam(':duration',$duration);
    					$db_request->bindParam(':client_address',$client_address);
    					$db_request->bindParam(':result_code',$result_code);				
    					$db_request->bindParam(':size',$size);				
    					$db_request->bindParam(':request_method',$request_method);
    					$db_request->bindParam(':url',$url);
    					$db_request->bindParam(':ident_lookup',$ident_lookup);
    					$db_request->bindParam(':hierarchy_code',$hierarchy_code);
    					$db_request->bindParam(':type',$type);
    					$db_request->execute();
    					var_dump($db_request);
    				}
    			break;
     
    	case false:
    			echo "the file $squidlogfile is not readable:"."<br>";
    			break;
    }
    }
    J'ai pourtant l'impression que le code est clair et précis non?

    Merci de ton aide par avance.

  17. #17
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Citation Envoyé par Benjamin Delespierre Voir le message
    Ce qui m'étonne c'est que tu mettes ce foreach dans la bouche while...
    Je l'avais même pas mentionné

    Pour ton erreur d'insertion, sache que PDOStatement ne lève pas d'exception lors de l'execution, il renvoie un status booléen. Je te recommande de procéder comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    if ($db_request->execute()) {
      echo "Line inserted<br />"; // ton message ici
    }
    else {
      $err = $db_object->errorInfo();
      die("-- Erreur SQL: {$err[2]} with code {$err[1]} on query [{$db_request->query_string}]");
    }
    Tu auras des messages d'erreur plus parlants

  18. #18
    Membre éclairé
    Avatar de ArKam
    Inscrit en
    Mars 2007
    Messages
    528
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mars 2007
    Messages : 528
    Points : 679
    Points
    679
    Par défaut
    Mea culpa.
    Oui en effet tu l'avais dit mais je sais pas pourquoi, je voulais à tout prix retraiter les données alors qu'elles étaient déjà traitées.

    Pour ce qui est des retours d'erreurs j'utilise errorInfo et errorCode parce que errorInfo me fournis un code de retour qui signifie SQLState error, qui ici correspond à:

    3D000 = NO_DB_ERROR = Je suis un boulet, j'ai pas sélectionné la base à inscrire :s

    Je reviens vers toi une fois que j'ai résolu mon souci

    Par contre, les Objets PHP sont ... étranges pour moi.
    J'ai pas l'habitude des objets, même en C++ je fais beaucoup de procédurale et très peu d'objet.

    Par contre, je dois reconnaître que c'est super efficace, et la syntaxe est plus jolie (Je sais, c'est pas la considération la plus importante, mais quand même XD).

  19. #19
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Le paradigme objet apporte bien plus que la beauté du code ça apporte surtout la généricité, le polymorphisme, l'encapsulation et l'héritage.
    A mon sens, seule la version 5.3 de PHP propose un support de l'objet digne de ce nom.

    Je te recommande vivement de lire quelques articles sur la question (il y en a un paquet sur developper.com). Mais avant tout, assure-toi de bien connaitre le principe de base. Si tu as des soucis, tu peux toujours poser tes questions sur le forum

    Si ça peux t'aider, tu as un cas d'héritage / composition dans ces classes (et puis ce package pourra peut être te servir): http://www.developpez.net/forums/d10...s/#post5894017

  20. #20
    Membre éclairé
    Avatar de ArKam
    Inscrit en
    Mars 2007
    Messages
    528
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mars 2007
    Messages : 528
    Points : 679
    Points
    679
    Par défaut
    Merci pour tes conseils et exemples.

    Pour l'instant j'améliore mon script, à savoir que j'essaye de récupérer la valeur de ma dernière ligne (son numéro).

    Ca OK j'y arrive avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <?php
    $parsedfile = new SplFileObject("$squidlogfile","r");
    			$parsedfile->setFlags(SplFileObject::SKIP_EMPTY);
    				while(!$parsedfile->eof()){
    					$parsedfile->next();
    					$nblineRaw = $parsedfile->key();
    				}
    			$lastLine = $nblineRaw - 1;
    			echo ("The last line of the file is: $lastLine"."<br>");
    ?>
    Le -1 viens du fait que meme avec le flag SKIP_EMPTY ma derniere ligne est vide, alors que dans le fichier j'ai bien que des lignes pleine et la derniere ligne n'a pas de retour chariot ou autres retour à la ligne.

    Par contre, une question me trotte dans la tête, est-ce que mon objet est détruit à la fin de la boucle while?

    Parce que si je fait la chose suivante:
    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
     
    $parsedfile = new SplFileObject("$squidlogfile","r");
    $parsedfile->setFlags(SplFileObject::SKIP_EMPTY);
     
          while(!$parsedfile->eof()){
    	    $parsedfile->next();
    	    $nblineRaw = $parsedfile->key();
    	}
     
    $lastLine = $nblineRaw - 1;
    echo ("The last line of the file is: $lastLine"."<br>");
     
          try{
    	$parsedfile->rewind();
    	}catch(RuntimeException $error){
    	    echo 'Exception RuntimeExecution Reçue: ', $error->getMessage(), "\n";
    	}
     
    $parsedfile->seek($lastLine);
    $currentLineContent = $parsedfile->fgets();
    echo $currentLineContent;
    J'ai un beau message m'avertissant que le script ne parviens pas à accéder au fichier, hors, en théorie il est déjà dedans non?

    Maintenant j'ai comme l'intuition que mon objet est détruit à la fin du while, vue que celui-ci à lu tout le fichier jusqu'à la fin.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 4
    Dernier message: 18/09/2007, 16h14
  2. parsing de fichier texte
    Par robert_trudel dans le forum Access
    Réponses: 4
    Dernier message: 03/06/2006, 17h45
  3. [DOM] [DocumentBuilder] Problème de parsing de fichier
    Par tck-lt dans le forum Format d'échange (XML, JSON...)
    Réponses: 9
    Dernier message: 13/04/2006, 17h18
  4. Parsing de fichier en C++ : Au secours :(
    Par Triqueur dans le forum C++
    Réponses: 4
    Dernier message: 16/02/2006, 14h49
  5. Réponses: 5
    Dernier message: 10/09/2005, 18h07

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