Re: php et apache

Startseite

Nachricht beantworten
Autor: Edgar Bonet
Datum:  
To: guilde
Betreff: Re: php et apache
Le lundi 27 mai, Stephane Driussi a écrit :
> [Analyse des champs d'une ligne de log Apache]
> Je sais qu'il faut utiliser split ou explode mais c'est l'ecriture de la
> chaine d'analyse en php qui me pose probleme. Quelqu'un n'aurait pas un
> bout de code qui m'aiderai a comprendre comment faire ?


J'ai écrit une fonction en Perl pou faire ça sur un fichier log au
format « NCSA extended/combined log format ». Je ne sais pas si PHP
utilise les mêmes regexps que Perl, mais ou cas où ça peut t'aider,
voici ma fonction :

# Cette fonction découpe une ligne en ses diffirents champs. Les champs
# date_time et request sont à leur tour découpés en sous-champs. Le
# découpage se fait comme suit :
#   ligne = 'host ident authuser [date_time] "request" status bytes
#           "referer" "agent"'
#   date_time = 'date:time zone'
#   request = 'method file protocol'
#
# Références :
#   - Documentation de Apache, module mod_log_config pour le
#     « NCSA extended/combined log format ».
#   - RFC 1945 pour le protocole HTTP/1.0
#   - RFC 2616 pour le protocole HTTP/1.1
sub parse {
    local($line) = @_;
    $host = $ident = $authuser = $date_time = $date = $day = $month =
        $year = $time = $hour = $minute = $second = $zone = $request =
        $method = $file = $protocol = $status = $bytes = $referer =
        $agent = undef;
    if ($line =~ /(.*?) \[(.*?)\] (.*)/) {
        $first_part = $1;
        $date_time = $2;
        $last_part = $3;
        if ($first_part =~ /(\S*) (\S*) (\S*)/) {
            $host = $1;
            $ident = $2;
            $authuser = $3;
        }
        if ($date_time =~ /(.*?):(\S*) (.*)/) {
            $date = $1;
            $time = $2;
            $zone = $3;
            if ($date =~ m|(.*?)/(.*?)/(.*)|) {
                $day = $1;
                $month = $2;
                $year = $3;
            }
            if ($time =~ /(..):(..):(..)/) {
                $hour = $1;
                $minute = $2;
                $second = $3;
            }
        }
        if ($last_part =~ /\"(.*?)\" (\S*?) (\S*?) \"(.*?)\" \"(.*?)\"/) {
            $request = $1;
            $status = $2;
            $bytes = $3;
            $referer = $4;
            $agent = $5;
            if ($request =~ /(\S*) (\S*) (\S*)/) {
                $method = $1;
                $file = $2;
                $protocol = $3;
            }
        }
    }
}


-- 
Edgar Bonet                         Tel:    +33 476 881 096
Laboratoire Louis Néel -- CNRS      Mobile: +33 677 197 939
25 av. des Martyrs, BP 166          Fax:    +33 476 881 191
38042 Grenoble cedex 9, France      e-mail: bonet@???