Hoe een website-hitcounter op te zetten met Redis en PHP op Ubuntu 20.04

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:

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:

  1. sudo apt update

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:

  1. sudo apt install -y php-redis

Herstart Apache om de nieuwe extensie te laden:

  1. sudo systemctl restart apache2

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

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

Voer vervolgens de volgende informatie in het test.php bestand in:

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

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:

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

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:

/var/www/html/hit_counter.php

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

/var/www/html/hit_counter.php

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

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

/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();
    }

Zodra voltooid, zou uw /var/www/html/hit_counter.php-bestand vergelijkbaar moeten zijn met de volgende code:

/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();
    }

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:

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

Vervolgens voer je de onderstaande informatie in het bestand in. Vervang EXAMPLE_PASSWORD door het juiste wachtwoord voor de Redis-server:

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

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:

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