Come Configurare un Contatore di Visite del Sito con Redis e PHP su Ubuntu 20.04

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:

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:

  1. sudo apt update

Quindi, esegui il seguente comando per installare php-redis. L’estensione fornisce un’API per comunicare con il negozio chiave-valore del server Redis:

  1. sudo apt install -y php-redis

Riavvia Apache per caricare la nuova estensione:

  1. sudo systemctl restart apache2

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/:

  1. sudo nano /var/www/html/test.php

Quindi, inserisci le seguenti informazioni nel file test.php:

/var/www/html/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:

  1. sudo nano /var/www/html/hit_counter.php

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:

/var/www/html/hit_counter.php

<?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:

/var/www/html/hit_counter.php

        $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:

/var/www/html/hit_counter.php


        $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 (...) {...}:

/var/www/html/hit_counter.php

        $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:

/var/www/html/hit_counter.php

<?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:

  1. sudo nano /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:

/var/www/html/log.php

<!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:

Source:
https://www.digitalocean.com/community/tutorials/how-to-set-up-a-website-hit-counter-with-redis-and-php-on-ubuntu-20-04