L’auteur a sélectionné la Fondation Apache Software pour recevoir un don dans le cadre du programme Write for DOnations.
Introduction
A hit counter is an application that records and indicates the number of visits your web page has received. The counter starts from 1 and is incremented once every time a web page is visited.
Pour suivre les visites, l’application de compteur de hits nécessite une forme de base de données. Alors que les systèmes de gestion de base de données basés sur le disque comme MySQL peuvent fonctionner, une base de données en mémoire est meilleure en termes de vitesse, de performance, de scalabilité, de simplicité et de facilité d’utilisation. C’est là que le serveur Redis intervient. Redis stocke les données dans la RAM de votre ordinateur au lieu de solliciter le disque à chaque fois que vous effectuez une opération d’entrée/sortie. Cela augmente considérablement le débit.
Pour suivre les visites de votre site, vous avez besoin d’une carte de hachage Redis. Il s’agit d’une structure de données qui met en œuvre une paire clé-valeur. Une carte de hachage fournit une table de hachage qui mappe les clés aux valeurs. Une fois qu’un utilisateur visite votre page Web, vous créez une clé basée sur son adresse IP publique ou son nom d’utilisateur (pour les utilisateurs authentifiés), puis vous initialisez leurs visites totales à une valeur de 1. Ensuite, chaque fois que l’utilisateur revisite votre page Web, vous vérifiez leurs visites totales depuis la carte de hachage Redis en fonction de leur adresse IP/nom d’utilisateur et vous incrémentez la valeur.
Dans ce guide, vous configurerez un compteur de visites de site Web avec Redis et PHP sur votre serveur Ubuntu 20.04. Les scripts PHP de ce guide utilisent les adresses IP publiques des visiteurs pour suivre leurs visites.
Prérequis
Pour suivre ce guide, assurez-vous d’avoir ce qui suit :
-
Un serveur Ubuntu 20.04 configuré à l’aide du guide Configuration initiale du serveur avec Ubuntu 20.04.
-
Un utilisateur non root avec des privilèges
sudo
. Suivez notre guide Comment créer un nouvel utilisateur sudo sur Ubuntu 20.04 [Démarrage rapide] pour configurer un utilisateur sudo non root. -
Apache et PHP. Pour les configurer, utilisez notre tutoriel Comment installer la pile Linux, Apache, MySQL, PHP (LAMP) sur Ubuntu 20.04. Vous pouvez sauter Étape 2 — Installation de MySQL et Étape 4 — Création d’un hôte virtuel pour votre site Web puisque vous n’avez pas besoin d’une base de données MySQL ou d’un hôte virtuel pour tester ce guide.
-
Serveur Redis. Lisez notre tutoriel Comment installer et sécuriser Redis sur Ubuntu 20.04 [Démarrage rapide] pour installer et sécuriser un serveur Redis.
Étape 1 — Installation de l’extension PHP Redis
Dans cette étape, vous installerez une extension Redis qui permet à PHP de communiquer avec le serveur Redis. Vous créerez également une page web de test qui met en œuvre la table de hachage Redis pour suivre les visites web.
Avant d’installer l’extension Redis, rafraîchissez l’index des informations de package Ubuntu :
Ensuite, exécutez la commande suivante pour installer php-redis
. L’extension fournit une API pour communiquer avec le magasin de clés-valeurs du serveur Redis :
Redémarrez Apache pour charger la nouvelle extension :
Vous avez maintenant installé une extension PHP qui communique avec votre serveur Redis. Ensuite, vous créerez une page web test.php
sous le répertoire racine du serveur web Apache. Il s’agit simplement d’un fichier d’exemple que les visiteurs demandent lorsqu’ils visitent votre site web avec un navigateur. Sous le capot, le fichier de page test.php
charge un script hit_counter.php
que vous créerez plus tard pour suivre les visites de page en utilisant le serveur Redis.
Dans un scénario réel, votre site web pourrait avoir des dizaines, voire des centaines de pages web. Pour ce guide, vous configurerez une seule page web à des fins de démonstration.
Dans votre fenêtre de terminal, utilisez nano
pour créer un nouveau fichier test.php
sous le répertoire racine de votre serveur web /var/www/html/
:
Ensuite, saisissez les informations suivantes dans le fichier test.php
:
<?php
require_once 'hit_counter.php';
?>
<!DOCTYPE html>
<html>
<head>
<title>Sample Test Page</title>
</head>
<body>
<h1>Sample test page</h1>
<p>This is a sample test page.</p>
</body>
</html>
Enregistrez et fermez le fichier lorsque vous avez terminé d’éditer. À cette étape, vous avez créé une simple page web HTML qui charge un fichier hit_counter.php
lorsqu’elle est visitée. Ensuite, vous coderez le fichier hit_counter.php
pour suivre les visites de la page de test.
Étape 2 — Création d’un script de compteur de visites Redis
Lorsque vous travaillez dans un environnement de production, il est très courant de séparer les fichiers PHP réutilisables. Cela vous permet d’implémenter la logique dans ces fichiers sur différentes parties du projet simplement en incluant leurs chemins au lieu de copier-coller le code. Cela rend la maintenance plus facile puisque vous n’avez besoin de modifier qu’un seul fichier en cas de besoin de modifier la logique. Cela vous fait gagner beaucoup de temps.
Vous allez appliquer la même stratégie dans ce guide. Vous allez créer un seul fichier hit_counter.php
que vous pouvez inclure sur n’importe quelle page Web nécessitant le suivi des visiteurs.
Dans ce fichier, vous utiliserez la bibliothèque php-redis
pour vous connecter au serveur Redis depuis PHP. Ensuite, vous créerez une table de hachage Redis pour stocker le nombre de visites qu’un visiteur a effectuées sur votre site Web. Vous utiliserez les adresses IP uniques des visiteurs comme clés Redis pour distinguer le nombre de visites de chaque visiteur dans le serveur Redis.
Dans votre fenêtre de terminal, ouvrez un nouveau fichier hit_counter.php
à l’aide de nano
à des fins d’édition:
Avec le fichier hit_counter.php
maintenant créé, ouvrez une nouvelle balise PHP <?php
. Ensuite, à l’intérieur d’un bloc try {
, saisissez le code suivant pour vous connecter à votre serveur Redis local sur le port 6379
. Remplacez EXAMPLE_PASSWORD
par le mot de passe d’authentification pour le serveur Redis:
<?php
try {
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->auth('EXAMPLE_PASSWORD');
Ensuite, donnez un nom à la table de hachage Redis ($siteVisitsMap
) de votre choix. Ce guide utilise siteStats
à des fins de démonstration:
$siteVisitsMap = 'siteStats';
Après avoir défini la table de hachage Redis, vous initialiserez maintenant une clé Redis vide ($visitorHashKey
). Ensuite, vous la peuplerez avec les adresses IP des visiteurs. Vous utiliserez la valeur de la variable $visitorHashKey
pour identifier de manière unique chaque visiteur demandant votre page web:
$visitorHashKey = '';
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
$visitorHashKey = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$visitorHashKey = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
$visitorHashKey = $_SERVER['REMOTE_ADDR'];
}
Dans ce code, vous utilisez l’instruction if
en PHP pour déterminer l’adresse IP du visiteur en vérifiant si les variables $_SERVER['HTTP_CLIENT_IP']
, $_SERVER['HTTP_X_FORWARDED_FOR']
, ou $_SERVER['REMOTE_ADDR']
sont renseignées.
Ensuite, initialisez une variable $totalVisits
pour stocker les visites totales pour chaque adresse IP et assignez-lui une valeur de 0. Ensuite, utilisez les instructions PHP if (...) {...} else {...}
et $redis->hExists($siteVisitsMap, $visitorHashKey)
pour vérifier si l’adresse IP a des entrées dans le serveur Redis.
Vous utiliserez l’instruction if ($redis->hExists($siteVisitsMap, $visitorHashKey)) {...}
pour vérifier si une clé $visitorHashKey
existe dans une map nommée $siteVisitsMap
.
Si la carte et la clé avec l’adresse IP nommée existent dans le serveur Redis, récupérez-les avec l’instruction $visitorData = $redis->hMget($siteVisitsMap, array($visitorHashKey));
et utilisez $totalVisits = $visitorData[$visitorHashKey] + 1;
pour incrémenter la variable $totalVisits
. Vous utilisez l’instruction $redis->hMget
pour obtenir les données de comptage des visites associées à une adresse IP. La fonction hMget
accepte le nom de votre carte ($siteVisitsMap
) et un tableau des clés que vous souhaitez récupérer depuis le serveur Redis. Dans ce cas, vous n’avez qu’une seule clé ($visitorHashKey
), mais vous devez la convertir en tableau en utilisant l’instruction array($visitorHashKey)
.
Si votre script rencontre l’adresse IP pour la première fois, définissez la variable $totalVisits
sur 1. Enfin, utilisez $redis->hSet($siteVisitsMap, $visitorHashKey, $totalVisits);
pour définir la valeur de $visitorHashKey
selon les résultats de la précédente instruction if (...) {...} else {...}
. L’instruction $redis->hSet($siteVisitsMap, $visitorHashKey, $totalVisits)
crée une carte de hachage $siteVisitsMap
dans le serveur Redis avec une clé nommée $visitorHashKey
ayant pour valeur $totalVisits
.
Ensuite, accueillez le visiteur en affichant le nombre total de visites et fermez le bloc } catch (...) {...}
:
$totalVisits = 0;
if ($redis->hExists($siteVisitsMap, $visitorHashKey)) {
$visitorData = $redis->hMget($siteVisitsMap, array($visitorHashKey));
$totalVisits = $visitorData[$visitorHashKey] + 1;
} else {
$totalVisits = 1;
}
$redis->hSet($siteVisitsMap, $visitorHashKey, $totalVisits);
echo "Welcome, you've visited this page " . $totalVisits . " times\n";
} catch (Exception $e) {
echo $e->getMessage();
}
Une fois terminé, votre fichier /var/www/html/hit_counter.php
devrait ressembler au code suivant:
<?php
try {
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->auth('EXAMPLE_PASSWORD');
$siteVisitsMap = 'siteStats';
$visitorHashKey = '';
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
$visitorHashKey = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$visitorHashKey = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
$visitorHashKey = $_SERVER['REMOTE_ADDR'];
}
$totalVisits = 0;
if ($redis->hExists($siteVisitsMap, $visitorHashKey)) {
$visitorData = $redis->hMget($siteVisitsMap, array($visitorHashKey));
$totalVisits = $visitorData[$visitorHashKey] + 1;
} else {
$totalVisits = 1;
}
$redis->hSet($siteVisitsMap, $visitorHashKey, $totalVisits);
echo "Welcome, you've visited this page " . $totalVisits . " times\n";
} catch (Exception $e) {
echo $e->getMessage();
}
Enregistrez et fermez le fichier lorsque vous avez terminé d’éditer. Vous avez maintenant codé un script hit_counter.php
. Ensuite, vous créerez un autre script PHP qui génère un rapport à partir des données recueillies dans la table de hachage Redis.
Étape 3 — Création d’un script de rapport sur les statistiques du site
Une fois que vous avez collecté des données dans une table de hachage Redis, elles pourraient ne pas avoir de sens si vous n’êtes pas capable de les récupérer et de les représenter dans un rapport. Dans cette étape, vous créerez un rapport de journal pour montrer les différents visiteurs du site et les visites totales qu’ils ont effectuées sur la page web de test.
Pour créer le script de rapport de journal, exécutez nano
dans votre fenêtre de terminal et créez un nouveau fichier /var/www/html/log_report.php
:
Ensuite, saisissez les informations ci-dessous dans le fichier. Remplacez EXAMPLE_PASSWORD
par le mot de passe correct pour le serveur Redis:
<!DOCTYPE html>
<html>
<head>
<title>Site Visits Report</title>
</head>
<body>
<h1>Site Visits Report</h1>
<table border = '1'>
<tr>
<th>No.</th>
<th>Visitor</th>
<th>Total Visits</th>
</tr>
<?php
try {
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->auth('EXAMPLE_PASSWORD');
$siteVisitsMap = 'siteStats';
$siteStats = $redis->HGETALL($siteVisitsMap);
$i = 1;
foreach ($siteStats as $visitor => $totalVisits) {
echo "<tr>";
echo "<td align = 'left'>" . $i . "." . "</td>";
echo "<td align = 'left'>" . $visitor . "</td>";
echo "<td align = 'right'>" . $totalVisits . "</td>";
echo "</tr>";
$i++;
}
} catch (Exception $e) {
echo $e->getMessage();
}
?>
</table>
</body>
</html>
Enregistrez et fermez le fichier une fois que vous avez terminé l’édition. Dans le script ci-dessus, vous vous connectez au serveur Redis et utilisez l’instruction $redis->HGETALL($siteVisitsMap);
pour récupérer la carte de hachage des visites de votre page web. Ensuite, vous utilisez la déclaration PHP foreach ($siteStats as $visitor => $totalVisits) {
pour boucler et afficher les adresses IP des visiteurs et le nombre de visites qu’ils ont effectuées sur votre site. Vous utilisez la commande Redis HGETALL
pour récupérer tous les champs (adresses IP) et valeurs (nombre total de visites par adresse IP) de la carte siteVisitsMap
.
Vous avez maintenant une page de test, un script de compteur de visites et une page de rapport pour vérifier les statistiques de votre site. Ensuite, vous testerez les fonctionnalités de votre compteur de visites et vérifierez si tout fonctionne.
Étape 4 — Test du compteur de visites Redis
Dans cette étape, vous testerez toute la logique de votre compteur de visites. Accédez à l’URL suivante dans votre navigateur Web. Remplacez l'adresse IP de votre serveur
par l’adresse IP publique ou le nom de domaine de votre serveur.
http://your-server-IP/test.php
Actualisez la page plusieurs fois en utilisant différents appareils pour générer suffisamment de statistiques. Après chaque visite, vous devriez recevoir la sortie suivante.
Ensuite, visitez l’URL suivante pour afficher votre rapport de visites de site dans un tableau HTML
http://your-server-IP/log_report.php
Vous devriez maintenant voir un rapport similaire à la sortie suivante.
Votre compteur de visites fonctionne désormais comme prévu.
Conclusion
Dans ce guide, vous avez configuré un compteur de visites de site web avec Redis et PHP sur votre serveur Ubuntu 20.04.
Comme vous pouvez le voir dans le code source d’exemple de ce guide, Redis propose des méthodes plus propres pour créer et mettre à jour des hachages.
Comme mentionné au début de ce guide, l’utilisation d’un système de gestion de base de données relationnelle peut encore fonctionner, mais vous devrez écrire beaucoup de code pour insérer et mettre à jour des données dans les tables sous-jacentes. De plus, les bases de données basées sur le disque peuvent rencontrer des problèmes de scalabilité lorsque votre site se développe.
Pour plus d’informations sur l’utilisation de Redis comme base de données en mémoire, suivez les guides ci-dessous :