Der Autor hat die Apache Software Foundation ausgewählt, um eine Spende im Rahmen des Write for Donations-Programms zu erhalten.
Einführung
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.
Um die Besuche zu verfolgen, benötigt die Trefferzähleranwendung eine Art von Datenbank. Während datenträgerbasierte Datenbankverwaltungssysteme wie MySQL funktionieren können, ist eine In-Memory-Datenbank in Bezug auf Geschwindigkeit, Leistung, Skalierbarkeit, Einfachheit und Benutzerfreundlichkeit besser. Hier kommt der Redis-Server ins Spiel. Redis speichert Daten im RAM Ihres Computers anstelle bei jeder Ein-/Ausgabeoperation auf die Festplatte zuzugreifen. Dies erhöht die Durchsatzrate signifikant.
Um die Besuche auf Ihrer Website zu verfolgen, benötigen Sie eine Redis-Hash-Map. Dies ist eine Datenstruktur, die ein Schlüssel-Wert-Paar implementiert. Eine Hash-Map bietet eine Hashtabelle, die Schlüssel auf Werte abbildet. Sobald ein Benutzer Ihre Webseite besucht, erstellen Sie einen Schlüssel basierend auf seiner öffentlichen IP-Adresse oder seinem Benutzernamen (für authentifizierte Benutzer), und dann initialisieren Sie ihre Gesamtbesuche auf einen Wert von 1. Dann überprüfen Sie jedes Mal, wenn der Benutzer Ihre Webseite erneut besucht, ihre Gesamtbesuche aus der Redis-Hash-Map basierend auf ihrer IP-Adresse/ihrem Benutzernamen und inkrementieren den Wert.
In diesem Leitfaden richten Sie einen Website-Trefferzähler mit Redis und PHP auf Ihrem Ubuntu 20.04-Server ein. Die PHP-Skripte in diesem Leitfaden verwenden die öffentlichen IP-Adressen der Besucher, um ihre Besuche zu verfolgen.
Voraussetzungen
Um diesem Leitfaden zu folgen, stellen Sie sicher, dass Sie Folgendes haben:
-
Einen Ubuntu 20.04 Server konfiguriert mit Hilfe des Leitfadens Initiale Servereinrichtung mit Ubuntu 20.04.
-
Einen nicht-root-Benutzer mit
sudo
-Berechtigungen. Befolgen Sie unseren Anleitung zum Erstellen eines neuen sudo-fähigen Benutzers unter Ubuntu 20.04 [Schnellstart], um einen nicht-root sudo-Benutzer einzurichten. -
Apache und PHP. Um diese einzurichten, verwenden Sie unser Anleitung zur Installation des Linux, Apache, MySQL, PHP (LAMP)-Stacks auf Ubuntu 20.04. Sie können Schritt 2 – MySQL installieren und Schritt 4 – Erstellen eines virtuellen Hosts für Ihre Website überspringen, da Sie keine MySQL-Datenbank oder einen virtuellen Host benötigen, um diesen Leitfaden zu testen.
-
Redis-Server. Lesen Sie unser Anleitung zum Installieren und Sichern von Redis unter Ubuntu 20.04 [Schnellstart], um einen Redis-Server zu installieren und zu sichern.
Schritt 1 — Installation der PHP Redis-Erweiterung
In diesem Schritt installieren Sie eine Redis-Erweiterung, die es PHP ermöglicht, mit dem Redis-Server zu kommunizieren. Sie werden auch eine Test-Webseite erstellen, die die Redis-Hash-Map verwendet, um Webbesuche zu verfolgen.
Vor der Installation der Redis-Erweiterung aktualisieren Sie den Index Ihrer Ubuntu-Paketinformationsquelle:
Dann führen Sie folgenden Befehl aus, um php-redis
zu installieren. Die Erweiterung bietet eine API zum Kommunizieren mit dem Redis-Server, dem Schlüssel-Wert-Speicher:
Starten Sie Apache neu, um die neue Erweiterung zu laden:
Sie haben jetzt eine PHP-Erweiterung installiert, die mit Ihrem Redis-Server kommuniziert. Als nächstes erstellen Sie eine test.php
-Webseite im Stammverzeichnis des Apache-Webservers. Dies ist nur eine Beispieldatei, die Besucher anfordern, wenn sie Ihre Website mit einem Browser besuchen. Unter der Oberfläche lädt die Seite test.php
ein Skript hit_counter.php
, das Sie später erstellen, um Seitenbesuche mit dem Redis-Server zu verfolgen.
In einem realen Szenario könnte Ihre Website dutzende oder sogar hunderte von Webseiten haben. Für diese Anleitung richten Sie eine einzelne Webseite nur zu Demonstrationszwecken ein.
In Ihrem Terminalfenster verwenden Sie nano
, um eine neue Datei test.php
im Stammverzeichnis Ihres Webservers /var/www/html/
zu erstellen:
Geben Sie dann die folgenden Informationen in die Datei test.php
ein:
<?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>
Speichern und schließen Sie die Datei, wenn Sie mit der Bearbeitung fertig sind. In diesem Schritt haben Sie eine einfache HTML-Webseite erstellt, die eine Datei hit_counter.php
lädt, wenn sie besucht wird. Als nächstes werden Sie das Skript hit_counter.php
codieren, um die Besuche der Testseite zu verfolgen.
Schritt 2 — Erstellen eines Redis Hit Counter Skripts
Bei der Arbeit in einer Produktionsumgebung ist es sehr üblich, wiederverwendbare PHP-Dateien zu trennen. Dies ermöglicht es Ihnen, die Logik in diesen Dateien auf verschiedenen Teilen des Projekts zu implementieren, indem Sie einfach ihre Pfade einbeziehen, anstatt den Code zu kopieren und einzufügen. Dies erleichtert die Wartung, da Sie nur eine Datei bearbeiten müssen, falls Sie die Logik ändern müssen. Dies spart Ihnen viel Zeit.
Sie werden dieselbe Strategie in diesem Leitfaden anwenden. Sie erstellen eine einzige hit_counter.php
-Datei, die Sie auf jeder Webseite einbeziehen können, die eine Besucher verfolgung erfordert.
In dieser Datei verwenden Sie die php-redis
-Bibliothek, um eine Verbindung zum Redis-Server von PHP aus herzustellen. Dann erstellen Sie eine Redis-Hash-Map, um die Anzahl der Besuche eines Besuchers auf Ihrer Website zu speichern. Sie verwenden die eindeutigen IP-Adressen der Besucher als Redis-Schlüssel, um die Anzahl der Besuche jedes Besuchers im Redis-Server zu unterscheiden.
In Ihrem Terminalfenster öffnen Sie eine neue hit_counter.php
-Datei mit nano
zum Bearbeiten:
Mit der jetzt erstellten hit_counter.php
-Datei öffnen Sie ein neues PHP-Tag <?php
. Dann geben Sie innerhalb eines try {
-Blocks den folgenden Code ein, um eine Verbindung zu Ihrem lokalen Redis-Server auf Port 6379
herzustellen. Ersetzen Sie BEISPIEL_PASSWORT
durch das Authentifizierungspasswort für den Redis-Server:
<?php
try {
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->auth('EXAMPLE_PASSWORD');
Als nächstes geben Sie der Redis-Hash-Map($siteVisitsMap
) einen Namen Ihrer Wahl. Dieser Leitfaden verwendet zu Demonstrationszwecken siteStats
:
$siteVisitsMap = 'siteStats';
Nachdem Sie die Redis-Hashtabelle definiert haben, initialisieren Sie jetzt einen leeren Redis-Schlüssel ($visitorHashKey
). Anschließend füllen Sie ihn mit den IP-Adressen der Besucher. Sie verwenden den Wert der Variablen $visitorHashKey
, um jeden Besucher zu identifizieren, der Ihre Webseite anfordert:
$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'];
}
In diesem Code verwenden Sie die PHP-if
-Anweisung, um die IP-Adresse des Besuchers zu bestimmen, indem Sie überprüfen, ob die Variablen $_SERVER['HTTP_CLIENT_IP']
, $_SERVER['HTTP_X_FORWARDED_FOR']
oder $_SERVER['REMOTE_ADDR']
befüllt sind.
Anschließend initialisieren Sie eine $totalVisits
-Variable, um die Gesamtbesuche für jede IP-Adresse zu speichern, und weisen ihr einen Wert von 0 zu. Verwenden Sie dann die PHP-if (...) {...} else {...}
-Anweisung und $redis->hExists($siteVisitsMap, $visitorHashKey)
-Anweisungen, um zu überprüfen, ob die IP-Adresse Einträge im Redis-Server hat.
Sie verwenden die Anweisung if ($redis->hExists($siteVisitsMap, $visitorHashKey)) {...}
, um zu überprüfen, ob ein $visitorHashKey
in einer Map mit dem Namen $siteVisitsMap
existiert.
Falls die Karte und der Schlüssel mit der benannten IP-Adresse im Redis-Server existieren, rufen Sie sie mit der Anweisung $visitorData = $redis->hMget($siteVisitsMap, array($visitorHashKey));
ab und verwenden Sie $totalVisits = $visitorData[$visitorHashKey] + 1;
, um die Variable $totalVisits
zu erhöhen. Sie verwenden die Anweisung $redis->hMget
, um die Hit-Zähldaten zu erhalten, die mit einer IP-Adresse verbunden sind. Die Funktion hMget
akzeptiert den Namen Ihrer Karte ($siteVisitsMap
) und ein Array der Schlüssel, die Sie vom Redis-Server abrufen möchten. In diesem Fall haben Sie nur einen Schlüssel ($visitorHashKey
), den Sie jedoch mit der Anweisung array($visitorHashKey)
in ein Array konvertieren müssen.
Wenn Ihr Skript die IP-Adresse zum ersten Mal trifft, setzen Sie die Variable $totalVisits
auf 1. Verwenden Sie abschließend $redis->hSet($siteVisitsMap, $visitorHashKey, $totalVisits);
, um den Wert des $visitorHashKey
entsprechend den Ergebnissen der vorherigen if (...) {...} else {...}
-Anweisung festzulegen. Die Anweisung $redis->hSet($siteVisitsMap, $visitorHashKey, $totalVisits)
erstellt eine $siteVisitsMap
-Hash-Map im Redis-Server mit einem Schlüssel namens $visitorHashKey
und einem Wert von $totalVisits
.
Dann begrüßen Sie den Besucher, indem Sie die Gesamtbesuche ausgeben, und schließen den } catch (...) {...}
-Block ab:
$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();
}
Nach Abschluss sollte Ihre Datei /var/www/html/hit_counter.php
ähnlich dem folgenden Code sein:
<?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();
}
Speichern Sie die Datei und schließen Sie sie, wenn Sie mit der Bearbeitung fertig sind. Sie haben nun ein Skript namens hit_counter.php
codiert. Als nächstes werden Sie ein weiteres PHP-Skript erstellen, das einen Bericht aus den in der Redis-Hash-Map gesammelten Daten generiert.
Schritt 3 — Erstellen eines Site-Statistik-Berichtsskripts
Wenn Sie Daten in einer Redis-Hash-Map gesammelt haben, ergibt es möglicherweise keinen Sinn, wenn Sie nicht in der Lage sind, die Informationen abzurufen und darzustellen. In diesem Schritt erstellen Sie einen Protokollbericht, um die verschiedenen Seitenbesucher und die Gesamtbesuche auf der Testwebseite anzuzeigen.
Um das Protokollberichtsskript zu erstellen, führen Sie nano
in Ihrem Terminalfenster aus und erstellen Sie eine neue Datei /var/www/html/log_report.php
:
Dann geben Sie die folgenden Informationen in die Datei ein. Ersetzen Sie EXAMPLE_PASSWORD
durch das korrekte Passwort für den Redis-Server:
<!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>
Speichern Sie die Datei und schließen Sie sie, wenn Sie mit der Bearbeitung fertig sind. In dem obigen Skript stellen Sie eine Verbindung zum Redis-Server her und verwenden die Anweisung $redis->HGETALL($siteVisitsMap);
, um Ihre Webseitenbesuchs-Hashmap abzurufen. Anschließend verwenden Sie die PHP-Anweisung foreach ($siteStats as $visitor => $totalVisits) {
, um zu durchlaufen und die IP-Adressen der Besucher und die Anzahl der Besuche auf Ihrer Website anzuzeigen. Sie verwenden den Redis-Befehl HGETALL
, um alle Felder (IP-Adressen) und Werte (Gesamtbesuche pro IP-Adresse) aus der siteVisitsMap
-Map abzurufen.
Sie haben jetzt eine Testseite, ein Hits-Zähler-Skript und eine Berichtsseite, um Ihre Seitenstatistiken zu überprüfen. Als nächstes werden Sie die Funktionalitäten Ihres Hit-Counters testen und sehen, ob alles funktioniert.
Schritt 4 — Testen des Redis-Hit-Counters
In diesem Schritt werden Sie die gesamte Logik für Ihren Hit-Counter testen. Navigieren Sie mit Ihrem Webbrowser zur folgenden URL. Ersetzen Sie Ihre-Server-IP
durch die öffentliche IP-Adresse oder den Domainnamen Ihres Servers.
http://your-server-IP/test.php
Aktualisieren Sie die Seite mehrmals mit verschiedenen Geräten, um genügend Statistiken zu generieren. Nach jedem Besuch sollten Sie folgende Ausgabe erhalten.
Besuchen Sie als Nächstes die folgende URL, um Ihren Besuchsbericht in einer HTML-Tabelle anzeigen zu lassen.
http://your-server-IP/log_report.php
Sie sollten jetzt einen Bericht ähnlich der folgenden Ausgabe sehen.
Ihr Trefferzähler funktioniert jetzt wie erwartet.
Fazit
In diesem Leitfaden haben Sie einen Website-Trefferzähler mit Redis und PHP auf Ihrem Ubuntu 20.04-Server eingerichtet.
Wie Sie am Beispiel des Quellcodes in diesem Leitfaden sehen können, bietet Redis sauberere Methoden zum Erstellen und Aktualisieren von Hash-Maps.
Wie zu Beginn dieses Leitfadens erwähnt, kann die Verwendung eines relationalen Datenbankmanagementsystems zwar funktionieren, aber Sie müssten eine Menge Code schreiben, um Daten in den zugrunde liegenden Tabellen einzufügen und zu aktualisieren. Darüber hinaus können datenträgerbasierte Datenbanken Skalierbarkeitsprobleme aufweisen, wenn Ihre Website wächst.
Für weitere Informationen zur Verwendung der Redis-In-Memory-Datenbank folgen Sie den unten aufgeführten Anleitungen: