L’autore ha selezionato la Apache Software Foundation per ricevere una donazione come parte del programma Scrivi per le Donazioni.
Introduzione
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.
Per tenere traccia delle visite, l’applicazione del contatore di accessi richiede una forma di database. Mentre i sistemi di gestione di database basati su disco come MySQL possono funzionare, un database in memoria è migliore in termini di velocità, prestazioni, scalabilità, semplicità e facilità d’uso. Ecco dove entra in gioco il server Redis. Redis memorizza i dati nella RAM del computer anziché colpire il disco ogni volta che si effettua un’operazione di input/output. Questo aumenta significativamente il throughput.
Per tenere traccia delle visite al tuo sito, è necessaria una mappa hash Redis. Si tratta di una struttura dati che implementa una coppia chiave-valore. Una mappa hash fornisce una tabella hash che mappa le chiavi ai valori. Una volta che un utente visita la tua pagina web, crei una chiave basata sul loro indirizzo IP pubblico o nome utente (per gli utenti autenticati), e quindi inizializzi le loro visite totali a un valore di 1. Poi, ogni volta che l’utente revisita la tua pagina web, controlli le loro visite totali dalla mappa hash Redis in base al loro indirizzo IP/nome utente e incrementi il valore.
In questa guida, configurerai un contatore di visite al sito web con Redis e PHP sul tuo server Ubuntu 20.04. Gli script PHP in questa guida utilizzano gli indirizzi IP pubblici dei visitatori per tracciare le loro visite.
Prerequisiti
Per seguire questa guida, assicurati di avere quanto segue:
-
Un server Ubuntu 20.04 configurato utilizzando la guida Configurazione Iniziale del Server con Ubuntu 20.04.
-
Un utente non-root con privilegi
sudo
. Segui la nostra guida Come Creare un Nuovo Utente Sudo abilitato su Ubuntu 20.04 [Avvio Rapido] per configurare un utente non-root sudo. -
Apache e PHP. Per configurare questi, utilizza il nostro tutorial Come Installare Linux, Apache, MySQL, PHP (stack LAMP) su Ubuntu 20.04. Puoi saltare Passaggio 2 — Installazione di MySQL e Passaggio 4 — Creazione di un Host Virtuale per il Tuo Sito Web poiché non è necessario un database MySQL o un host virtuale per testare questa guida.
-
Server Redis. Leggi il nostro tutorial Come installare e proteggere Redis su Ubuntu 20.04 [Avvio rapido] per installare e proteggere un server Redis.
Passo 1 — Installazione dell’estensione PHP Redis
In questo passaggio, installerai un’estensione Redis che permette a PHP di comunicare con il server Redis. Creerai anche una pagina web di test che implementa la mappa hash Redis per tracciare le visite web.
Prima di installare l’estensione Redis, aggiorna l’indice delle informazioni dei pacchetti Ubuntu:
Quindi, esegui il seguente comando per installare php-redis
. L’estensione fornisce un’API per comunicare con il negozio chiave-valore del server Redis:
Riavvia Apache per caricare la nuova estensione:
Hai ora installato un’estensione PHP che si collega al tuo server Redis. Successivamente, creerai una pagina web test.php
nella directory radice del web server Apache. Questo è solo un file di esempio che i visitatori richiedono quando visitano il tuo sito web con un browser. Nel backstage, il file della pagina test.php
carica uno script hit_counter.php
che creerai successivamente per tenere traccia delle visite alla pagina utilizzando il server Redis.
In uno scenario reale, il tuo sito web potrebbe avere decine o anche centinaia di pagine web. Per questa guida, configurerai una singola pagina web a scopo dimostrativo.
Nella finestra del terminale, utilizza nano
per creare un nuovo file test.php
nella directory radice del tuo web server /var/www/html/
:
Quindi, inserisci le seguenti informazioni nel file 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>
Salva e chiudi il file quando hai finito di modificare. In questo passaggio, hai creato una semplice pagina web HTML che carica un file hit_counter.php
quando viene visitata. Successivamente, scriverai il file hit_counter.php
per tracciare le visite alla pagina di test.
Passaggio 2 — Creazione di uno Script Contatore di Visite Redis
Quando si lavora in un ambiente di produzione, è molto convenzionale separare i file PHP riutilizzabili. Ciò ti consente di implementare la logica in questi file su diverse parti del progetto semplicemente includendo i loro percorsi anziché copiare e incollare il codice. Questo rende la manutenzione più facile poiché è sufficiente modificare un singolo file nel caso in cui sia necessario modificare la logica. Questo ti fa risparmiare molto tempo.
Applicherai la stessa strategia in questa guida. Creerai un singolo file hit_counter.php
che puoi includere in qualsiasi pagina web che richiede il tracciamento dei visitatori.
In questo file, utilizzerai la libreria php-redis
per connetterti al server Redis da PHP. Quindi, creerai una mappa hash Redis per memorizzare il numero di visite effettuate da un visitatore al tuo sito web. Utilizzerai gli indirizzi IP univoci dei visitatori come chiavi Redis per distinguere il conteggio delle visite di ciascun visitatore nel server Redis.
Nella finestra del terminale, apri un nuovo file hit_counter.php
utilizzando nano
per scopi di modifica:
Con il file hit_counter.php
ora creato, apri un nuovo tag PHP <?php
. Quindi, all’interno di un blocco try {
, inserisci il seguente codice per connetterti al tuo server Redis locale sulla porta 6379
. Sostituisci EXAMPLE_PASSWORD
con la password di autenticazione per il server Redis:
<?php
try {
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->auth('EXAMPLE_PASSWORD');
Successivamente, assegna un nome alla mappa hash Redis ($siteVisitsMap
) a tua scelta. Questa guida utilizza siteStats
a scopo dimostrativo:
$siteVisitsMap = 'siteStats';
Dopo aver definito la mappa hash di Redis, inizierai ora a inizializzare una chiave Redis vuota ($visitorHashKey
). Successivamente, la popolerai con gli indirizzi IP dei visitatori. Utilizzerai il valore della variabile $visitorHashKey
per identificare in modo univoco ciascun visitatore che richiede la tua pagina 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'];
}
In questo codice, stai utilizzando l’istruzione PHP if
per determinare l’indirizzo IP del visitatore controllando se le variabili $_SERVER['HTTP_CLIENT_IP']
, $_SERVER['HTTP_X_FORWARDED_FOR']
o $_SERVER['REMOTE_ADDR']
sono popolate.
In seguito, inizializza una variabile $totalVisits
per memorizzare le visite totali per ciascun indirizzo IP e assegnale un valore di 0. Quindi, utilizza le istruzioni PHP if (...) {...} else {...}
e $redis->hExists($siteVisitsMap, $visitorHashKey)
per verificare se l’indirizzo IP ha voci nel server Redis.
Utilizzerai l’istruzione if ($redis->hExists($siteVisitsMap, $visitorHashKey)) {...}
per verificare se una $visitorHashKey
esiste in una mappa chiamata $siteVisitsMap
.
Nel caso in cui esistano la mappa e la chiave con l’indirizzo IP nominato nel server Redis, recuperarle con l’istruzione $visitorData = $redis->hMget($siteVisitsMap, array($visitorHashKey));
e utilizzare $totalVisits = $visitorData[$visitorHashKey] + 1;
per incrementare la variabile $totalVisits
. Si sta utilizzando l’istruzione $redis->hMget
per ottenere i dati del conteggio dei visitatori associati a un indirizzo IP. La funzione hMget
accetta il nome della tua mappa ($siteVisitsMap
) e un array delle chiavi che desideri recuperare dal server Redis. In questo caso, hai solo una chiave ($visitorHashKey
), ma devi convertirla in un array utilizzando l’istruzione array($visitorHashKey)
.
Nel caso in cui lo script incontri per la prima volta l’indirizzo IP, impostare la variabile $totalVisits
su 1. Infine, utilizzare $redis->hSet($siteVisitsMap, $visitorHashKey, $totalVisits);
per impostare il valore di $visitorHashKey
in base ai risultati della precedente dichiarazione if (...) {...} else {...}
. L’istruzione $redis->hSet($siteVisitsMap, $visitorHashKey, $totalVisits)
crea una mappa hash $siteVisitsMap
nel server Redis con una chiave denominata $visitorHashKey
con un valore di $totalVisits
.
Successivamente, dare il benvenuto al visitatore stampando il totale delle visite e chiudere il blocco } 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();
}
Una volta completato, il tuo file /var/www/html/hit_counter.php
dovrebbe essere simile al seguente codice:
<?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();
}
Salva e chiudi il file quando hai finito di modificare. Hai ora codificato uno script hit_counter.php
. Successivamente, creerai un altro script PHP che genera un rapporto dai dati raccolti nella mappa hash di Redis.
Passaggio 3 — Creazione di uno Script per il Rapporto delle Statistiche del Sito
Una volta che hai raccolto i dati in una mappa hash di Redis, potrebbe non avere senso se non sei in grado di recuperare e rappresentare le informazioni in un rapporto. In questo passaggio, creerai un rapporto di registro per mostrare i diversi visitatori del sito e le visite totali che hanno effettuato sulla pagina web di prova.
Per creare lo script del rapporto di registro, esegui nano
sulla finestra del terminale e crea un nuovo file /var/www/html/log_report.php
:
Quindi, inserisci le informazioni di seguito nel file. Sostituisci EXAMPLE_PASSWORD
con la password corretta per il server 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>
Salva e chiudi il file quando hai finito con la modifica. Nel precedente script, ti stai connettendo al server Redis e stai utilizzando l’istruzione $redis->HGETALL($siteVisitsMap);
per recuperare la mappa hash delle visite alla tua pagina web. Quindi, stai utilizzando l’istruzione PHP foreach ($siteStats as $visitor => $totalVisits) {
per ciclare e visualizzare gli indirizzi IP dei visitatori e il numero di visite che hanno effettuato sul tuo sito. Stai utilizzando il comando Redis HGETALL
per recuperare tutti i campi (indirizzi IP) e i valori (visite totali per ciascun indirizzo IP) dalla mappa siteVisitsMap
.
Ora hai una pagina di test, uno script del contatore di accessi e una pagina di report per controllare le statistiche del tuo sito. Successivamente, testerai le funzionalità del tuo contatore di accessi e vedrai se tutto funziona.
Passaggio 4 — Testare il Contatore di Accessi Redis
In questo passaggio, testerai l’intera logica per il tuo contatore di accessi. Naviga all’URL seguente sul tuo browser web. Sostituisci your-server-IP
con l’indirizzo IP pubblico o il nome di dominio del tuo server.
http://your-server-IP/test.php
Aggiorna la pagina diverse volte utilizzando dispositivi diversi per generare abbastanza statistiche. Dopo ogni visita, dovresti ricevere il seguente output.
Successivamente, visita l’URL seguente per ottenere il report delle visite al tuo sito visualizzato in una tabella HTML
http://your-server-IP/log_report.php
Ora dovresti vedere un report simile al seguente output.
Il tuo contatore di visite ora funziona come previsto.
Conclusione
In questa guida, hai configurato un contatore di visite del sito con Redis e PHP sul tuo server Ubuntu 20.04.
Come puoi vedere dal codice sorgente di esempio in questa guida, Redis fornisce metodi più puliti per creare e aggiornare mappe hash.
Come menzionato all’inizio di questa guida, l’uso di un sistema di gestione di database relazionali potrebbe comunque funzionare ma scriverai tonnellate di codice per inserire e aggiornare dati nelle tabelle sottostanti. Inoltre, i database basati su disco potrebbero riscontrare problemi di scalabilità quando il tuo sito cresce.
Per ulteriori informazioni sull’uso del database in memoria Redis, segui le guide qui sotto: