Suivi des visites
Créez site12 en copiant site11.
- /cms
- ...
- site11
- site12
Dans ce chapitre, nous allons programmer la journalisation de toutes les requêtes vers le site, dans un fichier et dans la base de données.
Pour tester le résultat en ligne, entrez http://www.frasq.org/cms/site12 dans la barre d'adresse de votre navigateur.
Ajoutez un dossier appelé log directement à la racine du site :
- /cms/site12
- log
IMPORTANT : Assurez-vous que le processus Apache a le droit d'écrire dans le dossier :
$ chgrp www-data log
$ chmod 775 log
NOTE : Le nom du groupe du processus Apache est défini par la directive Group. Les configurations du serveur local et du serveur distant peuvent être différentes, selon votre fournisseur internet.
Définissez la variable globale $log_dir
dans config.inc :
- global $log_dir;
- $log_dir = ROOT_DIR . DIRECTORY_SEPARATOR . 'log';
Ajoutez les fichiers clientipaddress.php, validateipaddress.php et log.php dans le dossier library avec les contenus suivants :
- /cms/site12
- library
- clientipaddress.php
- validateipaddress.php
- log.php
- library
- function client_ip_address() {
- return $_SERVER['REMOTE_ADDR'];
- }
client_ip_address
retourne la variable PHP $_SERVER['REMOTE_ADDR']
.
NOTE : $_SERVER['HTTP_X_FORWARDED_FOR']
, dont la valeur a été ajoutée par un serveur mandataire, et $_SERVER['HTTP_CLIENT_IP']
, renseignée directement par le client, ne sont pas fiables.
- function validate_ip_address($ipaddress) {
- return preg_match('/^(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/', $ipaddress);
- }
validate_ip_address
retourne true
si $ipaddress
est une adresse IP valide, false
dans le cas contraire.
- require_once 'clientipaddress.php';
- require_once 'validateipaddress.php';
Charge les fonctions client_ip_address
et validate_ip_address
.
- function write_log($logfile, $textline=false) {
- global $log_dir;
- $ipaddress = client_ip_address();
- if (!validate_ip_address($ipaddress)) {
- return false;
- }
- $timestamp=strftime('%Y-%m-%d %H:%M:%S', time());
- $logmsg="$timestamp $ipaddress";
- if ($textline) {
- $logmsg .= "\t$textline";
- }
- $file = isset($log_dir) ? ($log_dir . DIRECTORY_SEPARATOR . $logfile) : $logfile;
- $r = @file_put_contents($file, array($logmsg, "\n"), FILE_APPEND);
- return $r;
- }
write_log
récupère l'adresse IP du client et la valide, formate l'empreinte du message avec la date et l'heure courantes suivie de l'adresse IP séparées par des espaces, puis ajoute $textline
précédé d'une tabulation.
Le message est ensuite écrit à la fin du fichier $logfile
dans le répertoire désigné par la variable globale $log_dir
si elle définie.
Les paramètres de journalisation des requêtes sont définis dans config.inc
:
- global $track_db, $track_log;
- global $track_visitor, $track_visitor_agent;
- $track_db=true;
- $track_log=true;
- $track_visitor=true;
- $track_visitor_agent=true;
$track_visitor
à true
provoque la journalisation des requêtes.
$track_visitor_agent
ajoute le contenu de l'en-tête User-Agent
aux données enregistrées.
$track_db
donne le nom de la table de la BD qui contient le journal, track
par défaut si $track_db
est à true
.
$track_log
donne le nom du fichier qui contient le journal, track.log dans le dossier défini par $log_dir
par défaut si $track_log
est à true
.
Si $track_db
et $track_log
sont à false
, aucune journalisation n'est effectuée.
NOTE : Vous pouvez facilement enregistrer d'autres informations comme la langue du visiteur.
La journalisation des requêtes est gérée par la fonction dispatch
dans engine.php :
- require_once 'track.php';
Charge la fonction track
.
- global $track_visitor, $track_visitor_agent;
- $req = $base_path ? substr(request_uri(), strlen($base_path)) : request_uri();
- if ($track_visitor) {
- track($req, $track_visitor_agent);
- }
Appelle track
en lui passant la requête du client $req
et l'option globale $track_agent
si la variable globale $track_visitor
vaut true
.
Ajoutez les fichiers useragent.php, validateuseragent.php et track.php dans le dossier library avec les contenus suivants :
- /cms/site12
- library
- useragent.php
- validateagent.php
- track.php
- library
- function user_agent() {
- if (isset($_SERVER['HTTP_USER_AGENT'])) {
- return $_SERVER['HTTP_USER_AGENT'];
- }
- return false;
- }
user_agent
retourne la variable PHP $_SERVER['HTTP_USER_AGENT']
.
- function validate_user_agent($agent) {
- return preg_match('/^[a-zA-Z0-9 \;\:\.\-\)\(\/\@\]\[\+\~\_\,\?\=\{\}\*\|\&\#\!]+$/', $agent);
- }
validate_user_agent
retourne true
si $agent
est une désignation d'un agent valide, false
dans le cas contraire.
- require_once 'clientipaddress.php';
- require_once 'validateipaddress.php';
- require_once 'requesturi.php';
- require_once 'useragent.php';
- require_once 'validateuseragent.php';
Charge les fonctions client_ip_address
, validate_ip_address
, request_uri
, user_agent
et validate_user_agent
.
- function track($request_uri=false, $track_agent=false) {
- global $track_log, $track_db;
- if (! ($track_log or $track_db) ) {
- return true;
- }
- if (!$request_uri) {
- $request_uri=request_uri();
- }
- if (!$request_uri) {
- return false;
- }
- $user_agent=$track_agent ? user_agent() : false;
- if (!validate_user_agent($user_agent)) {
- $user_agent=false;
- }
- $r = true;
track
sort immédiatement si les variables globales $track_log
et $track_db
sont false
.
Si le paramètre $request_uri
n'est pas défini, track
l'initialise en appelant la fonction request_uri
.
Si $request_uri
n'est toujours pas défini, track
sort.
Si le paramètre $track_agent
vaut true
, la variable $user_agent
est initialisée en appelant la fonction user_agent
et validée.
- if ($track_log) {
- require_once 'log.php';
- $logmsg = $request_uri;
- if ($user_agent) {
- $logmsg .= "\t" . $user_agent;
- }
- $r = write_log($track_log === true ? 'track.log' : $track_log, $logmsg);
- }
Si la variable globale $track_log
vaut true
, track
charge le code de la fonction write_log
et lui demande de journaliser la requête et éventuellement l'agent dans le fichier dont le nom est défini par $track_log
ou appelé track.log par défaut.
- if ($track_db) {
- $ip_address=client_ip_address();
- if (!validate_ip_address($ip_address)) {
- return false;
- }
- $sqlipaddress=db_sql_arg($ip_address, false);
- $sqlrequesturi=db_sql_arg($request_uri, true);
- $sqluseragent=db_sql_arg($user_agent, true, true);
- $tabtrack=db_prefix_table($track_db === true ? 'track' : $track_db);
- $sql="INSERT $tabtrack (ip_address, request_uri, user_agent) VALUES ($sqlipaddress, $sqlrequesturi, $sqluseragent)";
- $r = db_insert($sql);
- }
- return $r;
- }
Si la variable globale $track_db
vaut true
, track
récupère l'adresse IP du client et la valide puis prépare et exécute un ordre SQL qui enregistre les paramètres de la requête dans la table dont le nom est défini par $track_db
ou appelée track
par défaut.
Ajoutez la table track
à la BD du site :
$ mysql -u root -p
mysql> use frasqdb2;
mysql> CREATE TABLE track (
track_id int(10) unsigned NOT NULL AUTO_INCREMENT,
time_stamp timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
ip_address varchar(15) NOT NULL,
request_uri varchar(255) NOT NULL,
user_agent varchar(255) DEFAULT NULL,
PRIMARY KEY (track_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
mysql> quit
Vérifiez dans config.inc que les paramètres $track_log
et $track_db
sont à true
.
Entrez http://localhost/cms/site12/fr/accueil dans la barre d'adresse de votre navigateur, accédez à la page de contact, changez de langue.
Affichez le contenu du journal des connexions :
$ tail track.log
Pour obtenir le nombre total de visiteurs :
$ cut -f 1 track.log | cut -d' ' -f 3 | sort | uniq | wc -l
Pour lister les 10 pages les plus consultées :
$ cut -f 2 track.log | sort | uniq -c | sort -rn | head -10
Vérifiez la BD :
mysql> SELECT * FROM track;
Pour obtenir le nombre total de visiteurs :
mysql> SELECT COUNT(DISTINCT ip_address) from track;
Pour lister les 10 pages les plus consultées :
mysql> SELECT request_uri, COUNT(request_uri) AS count from track GROUP BY request_uri ORDER BY count DESC LIMIT 10;
IMPORTANT : La quantité de données générées peut rapidement remplir la BD et le journal. Optez pour un seul mode en mettant $track_db
ou $track_log
à false
. Une fois une campagne d'analyse du type des clients du site (navigateurs, mobiles, robots, etc.) terminée, laissez le paramètre $track_agent
à false
.
Commentaires