De auteur heeft de Apache Software Foundation geselecteerd om een donatie te ontvangen als onderdeel van het Write for DOnations-programma.
Introductie
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.
Om bezoeken bij te houden, heeft de hit counter-toepassing een vorm van een database nodig. Hoewel op schijf gebaseerde databasemanagementsystemen zoals MySQL kunnen werken, is een in-memory database beter qua snelheid, prestaties, schaalbaarheid, eenvoud en gebruiksgemak. Hier komt de Redis-server in beeld. Redis slaat gegevens op in het RAM-geheugen van uw computer in plaats van elke keer de schijf te benaderen wanneer u een in-/uitvoeroperatie uitvoert. Dit verhoogt de doorvoer aanzienlijk.
Om uw sitebezoeken bij te houden, heeft u een Redis hash map nodig. Dit is een datastructuur die een sleutel-waardepaar implementeert. Een hash map biedt een hash-tabel die sleutels aan waarden koppelt. Zodra een gebruiker uw webpagina bezoekt, maakt u een sleutel op basis van hun openbare IP-adres of gebruikersnaam (voor geauthenticeerde gebruikers), en initialiseert u vervolgens hun totale bezoeken op een waarde van 1. Telkens wanneer de gebruiker uw webpagina opnieuw bezoekt, controleert u hun totale bezoeken vanuit de Redis hash map op basis van hun IP-adres/gebruikersnaam en verhoogt u de waarde.
In deze handleiding zult u een website-hitcounter instellen met Redis en PHP op uw Ubuntu 20.04-server. De PHP-scripts in deze handleiding gebruiken de openbare IP-adressen van de bezoekers om hun bezoeken bij te houden.
Vereisten
Om deze handleiding te volgen, zorg ervoor dat je het volgende hebt:
-
Een Ubuntu 20.04-server geconfigureerd met behulp van de Initiële serverinstellingen met Ubuntu 20.04 handleiding.
-
Een niet-rootgebruiker met
sudo
-rechten. Volg onze Hoe maak je een nieuwe Sudo-geactiveerde gebruiker aan op Ubuntu 20.04 [Snelstart] handleiding om een niet-root sudo-gebruiker in te stellen. -
Apache en PHP. Om deze in te stellen, gebruik onze Hoe installeer je Linux, Apache, MySQL, PHP (LAMP)-stack op Ubuntu 20.04 zelfstudie. Je kunt Stap 2 — MySQL installeren en Stap 4 — Het maken van een virtuele host voor je website overslaan omdat je geen MySQL-database of een virtuele host nodig hebt om deze handleiding te testen.
-
Redis-server. Lees onze Handleiding voor het installeren en beveiligen van Redis op Ubuntu 20.04 [Snelstart] om een Redis-server te installeren en te beveiligen.
Stap 1 — PHP Redis-extensie installeren
In deze stap installeert u een Redis-extensie die PHP in staat stelt te communiceren met de Redis-server. U zult ook een testwebpagina maken die de Redis-hashmap implementeert om webbezoeken bij te houden.
Voordat u de Redis-extensie installeert, vernieuwt u eerst uw Ubuntu-pakketinformatie-index:
Voer vervolgens het volgende commando uit om php-redis
te installeren. De extensie biedt een API voor communicatie met de Redis-server key-value store:
Herstart Apache om de nieuwe extensie te laden:
Je hebt nu een PHP-extensie geïnstalleerd die communiceert met je Redis-server. Vervolgens maak je een test.php
webpagina aan onder de hoofdmap van de Apache-webserver. Dit is slechts een voorbeeldbestand dat bezoekers aanvragen wanneer ze je website met een browser bezoeken. Onder de motorkap laadt de test.php
pagina een hit_counter.php
script dat je later zult maken om paginabezoeken bij te houden met behulp van de Redis-server.
In een realistisch scenario kan je website tientallen of zelfs honderden webpagina’s hebben. Voor deze handleiding zal je een enkele webpagina opzetten ter demonstratie.
In je terminalvenster gebruik je nano
om een nieuw test.php
bestand aan te maken onder de hoofdmap van je webserver /var/www/html/
:
Voer vervolgens de volgende informatie in het test.php
bestand in:
<?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>
Sla het bestand op en sluit het af wanneer je klaar bent met bewerken. In deze stap heb je een eenvoudige HTML-webpagina gemaakt die een hit_counter.php
bestand laadt wanneer deze wordt bezocht. Vervolgens ga je het hit_counter.php
bestand coderen om de bezoeken aan de testpagina bij te houden.
Stap 2 – Een Redis Hit-teller script maken
Bij het werken in een productieomgeving is het heel gebruikelijk om herbruikbare PHP-bestanden te scheiden. Hierdoor kunt u de logica in deze bestanden implementeren op verschillende delen van het project door simpelweg hun paden op te nemen in plaats van de code te kopiëren en te plakken. Dit maakt het onderhoud gemakkelijker omdat u slechts één bestand hoeft te bewerken als u de logica wilt wijzigen. Dit bespaart u veel tijd.
U gaat dezelfde strategie toepassen in deze handleiding. U zult een enkel hit_counter.php
-bestand maken dat u kunt opnemen op elke webpagina die bezoekersvolging vereist.
In dit bestand zult u de php-redis
-bibliotheek gebruiken om verbinding te maken met de Redis-server vanuit PHP. Vervolgens maakt u een Redis-hashmap om het aantal bezoeken van een bezoeker aan uw website op te slaan. U zult de unieke IP-adressen van bezoekers gebruiken als Redis-sleutels om het aantal hits van elke bezoeker in de Redis-server te onderscheiden.
In uw terminalvenster opent u een nieuw hit_counter.php
-bestand met behulp van nano
voor bewerkingsdoeleinden:
Met het hit_counter.php
-bestand nu aangemaakt, opent u een nieuwe PHP-tag <?php
. Vervolgens, binnen een try {
-blok voert u de volgende code in om verbinding te maken met uw lokale Redis-server op poort 6379
. Vervang EXAMPLE_PASSWORD
door het authenticatiewachtwoord voor de Redis-server:
<?php
try {
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->auth('EXAMPLE_PASSWORD');
Geef vervolgens de Redis-hashmap ($siteVisitsMap
) een naam naar keuze. Deze handleiding gebruikt siteStats
ter illustratie:
$siteVisitsMap = 'siteStats';
Na het definiëren van de Redis-hashmap, zult u nu een lege Redis-sleutel initialiseren ($visitorHashKey
). Vervolgens zult u deze vullen met de IP-adressen van de bezoekers. U zult de waarde van de variabele $visitorHashKey
gebruiken om elke bezoeker die uw webpagina aanvraagt uniek te identificeren:
$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 deze code gebruikt u de PHP if
-verklaring om het IP-adres van de bezoeker te bepalen door te controleren of de variabelen $_SERVER['HTTP_CLIENT_IP']
, $_SERVER['HTTP_X_FORWARDED_FOR']
of $_SERVER['REMOTE_ADDR']
zijn ingevuld.
Vervolgens initialiseert u een variabele $totalVisits
om de totale bezoeken voor elk IP-adres op te slaan en wijst u deze een waarde van 0 toe. Gebruik vervolgens de PHP if (...) {...} else {...}
-verklaringen en $redis->hExists($siteVisitsMap, $visitorHashKey)
om te controleren of het IP-adres vermeldingen heeft in de Redis-server.
U zult de verklaring if ($redis->hExists($siteVisitsMap, $visitorHashKey)) {...}
gebruiken om te controleren of een $visitorHashKey
bestaat in een map met de naam $siteVisitsMap
.
Indien de kaart en de sleutel met het genoemde IP-adres aanwezig zijn in de Redis-server, haal deze dan op met de verklaring $visitorData = $redis->hMget($siteVisitsMap, array($visitorHashKey));
en gebruik $totalVisits = $visitorData[$visitorHashKey] + 1;
om de $totalVisits
-variabele te verhogen. U gebruikt de $redis->hMget
-verklaring om hit telling gegevens op te halen die zijn geassocieerd met een IP-adres. De hMget
-functie accepteert de naam van uw kaart ($siteVisitsMap
) en een array van de sleutels die u wilt ophalen uit de Redis-server. In dit geval heeft u slechts één sleutel ($visitorHashKey
), maar u moet deze omzetten naar een array met behulp van de verklaring array($visitorHashKey)
.
Indien uw script het IP-adres voor de eerste keer tegenkomt, stel dan de $totalVisits
-variabele in op 1. Gebruik ten slotte $redis->hSet($siteVisitsMap, $visitorHashKey, $totalVisits);
om de waarde van de $visitorHashKey
in te stellen volgens de resultaten van de vorige if (...) {...} else {...}
-verklaring. De $redis->hSet($siteVisitsMap, $visitorHashKey, $totalVisits)
-verklaring maakt een $siteVisitsMap
hash map in de Redis-server met een sleutel genaamd $visitorHashKey
met een waarde van $totalVisits
.
Vervolgens, verwelkom de bezoeker door het totale aantal bezoeken te echoën en sluit het } catch (...) {...}
-blok:
$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();
}
Zodra voltooid, zou uw /var/www/html/hit_counter.php
-bestand vergelijkbaar moeten zijn met de volgende code:
<?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();
}
Sla het bestand op en sluit het af wanneer je klaar bent met bewerken. Je hebt nu een hit_counter.php
script geschreven. Vervolgens maak je een ander PHP-script dat een rapport genereert op basis van de gegevens verzameld in de Redis-hashmap.
Stap 3 – Het maken van een Site Statistieken Rapport Script
Zodra je gegevens hebt verzameld in een Redis-hashmap, heeft het misschien geen zin als je niet in staat bent om de informatie op te halen en weer te geven in een rapport. In deze stap maak je een lograpport om de verschillende sitebezoekers en de totale bezoeken die ze hebben gemaakt op de testwebpagina weer te geven.
Om het lograpportscript te maken, voer nano
uit in je terminalvenster en maak een nieuw /var/www/html/log_report.php
bestand aan:
Vervolgens voer je de onderstaande informatie in het bestand in. Vervang EXAMPLE_PASSWORD
door het juiste wachtwoord voor de 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>
Opslaan en sluit het bestand af wanneer je klaar bent met bewerken. In het bovenstaande script maak je verbinding met de Redis-server en gebruik je de verklaring $redis->HGETALL($siteVisitsMap);
om de hashmap van je webpagina-bezoeken op te halen. Vervolgens gebruik je de PHP foreach ($siteStats as $visitor => $totalVisits) {
-verklaring om te itereren en de IP-adressen van de bezoekers en het aantal bezoeken dat ze aan je site hebben gemaakt, weer te geven. Je gebruikt het Redis HGETALL
-commando om alle velden (IP-adressen) en waarden (totaal aantal bezoeken per IP-adres) op te halen uit de siteVisitsMap
-map.
Je hebt nu een testpagina, een hit-teller script, en een rapportpagina om je site-statistieken te controleren. Vervolgens zul je de functionaliteiten van je hit-teller testen en zien of alles werkt.
Stap 4 — Testen van de Redis Hit-teller
In deze stap zul je de gehele logica voor je hit-teller testen. Navigeer naar de volgende URL in je webbrowser. Vervang your-server-IP
door het publieke IP-adres of domeinnaam van je server.
http://your-server-IP/test.php
Vernieuw de pagina meerdere keren met verschillende apparaten om voldoende statistieken te genereren. Na elk bezoek zou je de volgende output moeten ontvangen.
Bezoek vervolgens de volgende URL om je site-bezoekrapport weer te geven in een HTML-tabel
http://your-server-IP/log_report.php
Je zou nu een rapport moeten zien dat vergelijkbaar is met de volgende output.
Uw hit-teller werkt nu zoals verwacht.
Conclusie
In deze handleiding heeft u een website-hit-teller opgezet met Redis en PHP op uw Ubuntu 20.04-server.
Zoals u kunt zien aan de hand van de voorbeeldbroncode in deze handleiding, biedt Redis schonere methoden voor het maken en bijwerken van hashmaps.
Zoals vermeld aan het begin van deze handleiding, kan het gebruik van een relationeel databasesysteem nog steeds werken, maar zult u veel code moeten schrijven om gegevens in onderliggende tabellen in te voegen en bij te werken. Bovendien kunnen op schijf gebaseerde databases schaalbaarheidsproblemen ondervinden wanneer uw site groeit.
Voor meer informatie over het gebruik van de in-memory database van Redis, volg de onderstaande handleidingen: