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 Perl Discussion :

Intégrer le compteur de visites dans toutes les pages


Sujet :

Langage Perl

  1. #1
    Expert éminent

    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juillet 2004
    Messages
    2 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 756
    Points : 6 686
    Points
    6 686
    Par défaut Intégrer le compteur de visites dans toutes les pages
    Bonjour

    J'ai développé un script visits.cgi utilisé pour afficher sur ma page d'accueil, le nombre de visiteurs uniques. Je souhaite le modifier de façon à pouvoir comptabiliser les visites sur les autres pages de mon site.

    Auriez-vous des idées à me soumettre s'il vous plaît ? Je ne sais pas du tout comment faire

    Merci
    .Olivier

  2. #2
    Expert éminent

    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juillet 2004
    Messages
    2 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 756
    Points : 6 686
    Points
    6 686
    Par défaut
    Je pense avoir une idée. Dans un premier temps, créer deux fichiers. Un, à placer sur toutes les pages de mon site qui comptera le nombre de visites et le deuxième qui sera utilisé sur la page d'accueil pour afficher le résultat. Créer également un paquet .pm avec les différentes opérations

    Suis-je sur la bonne voie ?

    Merci
    .Olivier

  3. #3
    Expert éminent

    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juillet 2004
    Messages
    2 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 756
    Points : 6 686
    Points
    6 686
    Par défaut
    J'ai pensé que mon idée citée ci-dessus était la bonne mais je n'arrive pas à la mettre en application. Il ne doit pas y avoir grand chose à modifier et je reste persuader que l'utilisation d'une fonction ou deux est la bonne. Pouvez-vous sérieusement me donner un coup de main s'il vous plaît ? Je tiens vraiment à terminer ce projet.

    Merci d'avance
    .Olivier

  4. #4
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Tu as juste à faire un module avec une fonction qui s'occupe de rajouter un hit et d'afficher le compteur à chaque fois qu'elle est appelé, en prenant un paramètre qui lui dit dans quel fichier est stocké le compte jusqu'ici pour cette page (n'oublie pas de prendre un lock sur ce fichier et de le relacher après l'avoir mis à jour pour éviter les problèmes).

    --
    Jedaï

  5. #5
    Expert éminent

    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juillet 2004
    Messages
    2 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 756
    Points : 6 686
    Points
    6 686
    Par défaut
    Coucou Jedai

    J'ai avancé un peu. J'ai crée le script principal, visits.cgi:
    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
    #!/usr/bin/perl -w
     
    use strict;
    use diagnostics;
    use warnings;
     
    use CGI qw(:standard);
    use CGI::Carp qw(warningsToBrowser fatalsToBrowser);
     
    use Visits;
    Visits::check_logfiles;
    Visits::check_ip;
     
    $CGI::POST_MAX=1024*100;
    $CGI::DISABLE_UPLOADS=1;
     
    my $cgi=new CGI;
    my $nb=Visits::visits_number();
     
    print $cgi->header(-charset=>'utf-8');
    print $nb;
    Le module, Visits.pm:
    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
    package Visits;
    use strict;
     
    my $visits_logfile='/chemin/cgi-bin/log2/visits.log';
    my $ip_logfile='/chemin/cgi-bin/log2/ip.log';
    my $external_ip=$ENV{'REMOTE_ADDR'};
    my $default_visits=0;
    my $default_ip="0.0.0.0";
     
    sub check_logfiles
    {
        if ((! -e $visits_logfile) && (! -e $ip_logfile))
        {
            open (my $FILE,">> $visits_logfile");
            print $FILE $default_visits,"\n";
            close $FILE;
     
            open (my $FILE,">> $ip_logfile");
            print $FILE $default_ip,"\n";
            close $FILE;
        }
    }
    sub check_ip
    {
        my $single;
        our $visits_number;
     
        open (my $FILE,"$ip_logfile");
        while (<$FILE>)
        {
            my $line=$_;
            if ($line==$external_ip)
            {
                $single="FALSE";
                last;
            }
            else
            {
                $single="TRUE";
            }
         }
         close $FILE;
         if ($single eq "TRUE")
         {
            open (my $FILE,">> $ip_logfile");
            print $FILE $external_ip,"\n";
            close $FILE;
     
                open (my $FILE,"+< $visits_logfile");
            $visits_number=<$FILE>;
            close $FILE;
     
            $visits_number=~ s/\n//;
            $visits_number++;
     
            open (my $FILE,"> $visits_logfile");
            print $FILE $visits_number;
            close $FILE;
          }
    }
    sub visits_number {
        open (my $FILE,"$visits_logfile");
        my $nb=<$FILE>;
        close $FILE;
        return $nb;
    }
    1;
    Mais je suis toujours bloqué au même point, créer le script cgi à intégrer dans les autres pages de mon site web afin de compter les visites

    Merki
    .Olivier

  6. #6
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Counter.pm :
    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
    package Counter;
    use strict; use warnings;
    use CGI qw/:standard/;
    use Fcntl qw/:flock/;
     
    use base 'Exporter';
    our @EXPORT = qw(my_counter);
     
    my $prefix_counters = '/var/counters/';
     
    sub my_counter {
      my $name = shift || "global";
      update_log($name);
      my $count = update_count($name);
     
      return span({-class => 'counter'}, $count);
    }
     
    sub update_log {
      my $name = shift;
      my $path = "$prefix_counters$name.log";
      open my($log), '>>', $path
        or die "Couldn't open $path : $!\n";
      flock $log, LOCK_EX;
      seek $log, 0, 2;
      print {$log} remote_host(), " ", referer(), "\n";
      flock $log, LOCK_UN;
    }
     
    sub update_count {
      my $name = shift;
      my $path = "$prefix_counters$name.count";
      open my($counter), '+<', $path
        or die "Couldn't open $path : $!\n";
      flock $counter, LOCK_EX;
      my $count = do { local $/; <$counter> };
      $count ||= 0;
      seek $counter, 0, 0;
      truncate $counter, 0;
      print {$counter} $count + 1;
      flock $counter, LOCK_UN;
      return $count;
    }
    Et ensuite quand tu génères ta page, tu mets my_counter("nomDuCompteur") à l'endroit où tu veux introduire le compteur.

    (Mets dans $prefix_counter un chemin auquel ton script aura accès)

    --
    Jedaï

  7. #7
    Expert éminent

    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juillet 2004
    Messages
    2 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 756
    Points : 6 686
    Points
    6 686
    Par défaut
    Je ne comprends pas bien le fonctionnement de Counter.pm. Mon objectif n'est pas de compter les hits mais bien le nombre de visites basés sur les adresses IP uniques. Le paquet Visits.pm dont le code figure un peu plus haut remplit cette tâche et le fichiers visits.cgi affiche sur ma page d'accueil le nombre de visites uniques. Théoriquement, je dois créer un nouveau script à ajouter dans toutes mes pages dans le cas où le visiteur ne passerait pas par la page d'accueil. J'ai besoin d'explications supplémentaires

    Merci
    .Olivier

  8. #8
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Je n'avais pas compris ça, dans ce cas :
    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
    package Counter;
    use strict; use warnings;
    use CGI qw/:standard/;
    use Fcntl qw/:flock/;
     
    use base 'Exporter';
    our @EXPORT = qw(my_counter);
     
    my $prefix_counters = '/var/counters/';
     
    sub my_counter {
      my $name = shift || "global";
      my $count = update_count($name, update_log($name));
     
      return $count;
    }
     
    sub update_log {
      my $name = shift;
      my ($path, $is_uniq, $remote_ip) = 
        ("$prefix_counters$name.log", 1, remote_host());
      open my($log), '+<', $path
        or die "Couldn't open $path : $!\n";
      flock $log, LOCK_EX;
      while( <$log> ) {
        chomp;
        if( $_ eq $remote_ip ) {
          $is_uniq = 0;
          last;
        }
      }
      print {$log} $remote_ip, "\n" if $is_uniq;
      flock $log, LOCK_UN;
      return $is_uniq;
    }
     
    sub update_count {
      my ($name, $is_uniq) = @_;
      my $path = "$prefix_counters$name.count";
      open my($counter), '+<', $path
        or die "Couldn't open $path : $!\n";
      flock $counter, LOCK_EX;
      my $count = do { local $/; <$counter> };
      $count ||= 0;
      if( $is_uniq ) {
        seek $counter, 0, 0;
        truncate $counter, 0;
        print {$counter} $count + 1;
      }
      flock $counter, LOCK_UN;
      return $count;
    }
     
    1;
    Et il suffit d'écrire "use Counter; my_counter()" dans tous tes scripts CGI où tu veux compter les visites.

    Pour les pages statiques, rajoute une image avec un lien vers ce script :
    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
    #!/usr/bin/perl -T
    use strict; use warnings;
    use CGI qw/:standard/;
     
    use Counter; my_counter();
     
    my $img_path = 'stats.png';
     
    print header('image/png');
    binary STDOUT;
     
    open my($img), '<:raw', $img_path
      or die "Couldn't load $img_path : $!\n";
    while( <$img> ) {
      print;
    }
     
    __END__
    Et tu peux mettre ce que tu veux comme image (ou même un truc minuscule et invisible).

    (Mon code pour Counter.pm est normalement plus robuste que ton Visits.pm)

    --
    Jedaï

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 12/08/2009, 21h54
  2. La meme entete dans toutes les pages
    Par Elwe31 dans le forum ASP.NET
    Réponses: 2
    Dernier message: 18/06/2008, 22h26
  3. Variable de session dans toute les pages
    Par Interface dans le forum Langage
    Réponses: 3
    Dernier message: 03/10/2007, 13h02
  4. Répéter l'en-tête de l'état dans toutes les pages
    Par k-eisti dans le forum Modélisation
    Réponses: 3
    Dernier message: 17/08/2007, 12h15
  5. Réponses: 4
    Dernier message: 06/08/2007, 17h10

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