Como Configurar um Contador de Acessos ao Site Com Redis e PHP no Ubuntu 20.04

O autor selecionou a Apache Software Foundation para receber uma doação como parte do programa Write for DOnations.

Introdução

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.

Para acompanhar as visitas, o aplicativo contador de acessos requer uma forma de banco de dados. Enquanto sistemas de gerenciamento de banco de dados baseados em disco como o MySQL podem funcionar, um banco de dados em memória é melhor em termos de velocidade, desempenho, escalabilidade, simplicidade e facilidade de uso. É aqui que entra o servidor Redis. O Redis armazena dados na RAM do seu computador em vez de acessar o disco sempre que você realiza uma operação de entrada/saída. Isso aumenta significativamente o rendimento.

Para rastrear as visitas ao seu site, você precisa de um mapa hash do Redis. Este é uma estrutura de dados que implementa um par chave-valor. Um mapa hash fornece uma tabela hash que mapeia chaves para valores. Quando um usuário visita sua página da web, você cria uma chave com base em seu endereço IP público ou nome de usuário (para usuários autenticados), e então você inicializa suas visitas totais para um valor de 1. Em seguida, toda vez que o usuário revisita sua página da web, você verifica suas visitas totais no mapa hash do Redis com base em seu endereço IP/nome de usuário e incrementa o valor.

Neste guia, você configurará um contador de acessos ao site com Redis e PHP no seu servidor Ubuntu 20.04. Os scripts PHP neste guia usam os endereços IP públicos dos visitantes para rastrear suas visitas.

Pré-requisitos

Para acompanhar este guia, certifique-se de ter o seguinte:

Passo 1 — Instalando a Extensão PHP Redis

Neste passo, você instalará uma extensão Redis que permite ao PHP se comunicar com o servidor Redis. Você também criará uma página web de teste que implementa o mapa hash do Redis para rastrear visitas à web.

Antes de instalar a extensão Redis, atualize o índice de informações de pacotes do seu Ubuntu:

  1. sudo apt update

Em seguida, execute o seguinte comando para instalar php-redis. A extensão fornece uma API para comunicação com o servidor de armazenamento de chave-valor do Redis:

  1. sudo apt install -y php-redis

Reinicie o Apache para carregar a nova extensão:

  1. sudo systemctl restart apache2

Agora você instalou uma extensão PHP que se comunica com o seu servidor Redis. Em seguida, você criará uma página da web test.php no diretório raiz do servidor web Apache. Este é apenas um arquivo de amostra que os visitantes solicitam ao visitar seu site com um navegador. Por baixo dos panos, o arquivo da página test.php carrega um script hit_counter.php que você criará posteriormente para rastrear as visitas à página usando o servidor Redis.

Em um cenário da vida real, seu site pode ter dezenas ou até centenas de páginas da web. Para este guia, você configurará uma única página da web para fins de demonstração.

Na sua janela de terminal, use o nano para criar um novo arquivo test.php no diretório raiz do seu servidor web /var/www/html/:

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

Em seguida, insira as seguintes informações no arquivo 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>

Salve e feche o arquivo quando terminar de editar. Neste passo, você criou uma página da web HTML simples que carrega um arquivo hit_counter.php quando visitado. Em seguida, você codificará o arquivo hit_counter.php para rastrear as visitas à página de teste.

Passo 2 — Criando um Script de Contador de Visitas do Redis

Ao trabalhar em um ambiente de produção, é muito convencional separar arquivos PHP reutilizáveis. Isso permite implementar a lógica nesses arquivos em diferentes partes do projeto apenas incluindo seus caminhos em vez de copiar e colar o código. Isso facilita a manutenção, pois você só precisa editar um único arquivo caso precise alterar a lógica. Isso economiza muito tempo.

Você vai aplicar a mesma estratégia neste guia. Você criará um único arquivo hit_counter.php que pode ser incluído em qualquer página da web que necessite rastrear visitantes.

Neste arquivo, você usará a biblioteca php-redis para se conectar ao servidor Redis a partir do PHP. Em seguida, você criará um mapa de hash do Redis para armazenar o número de visitas que um visitante fez ao seu site. Você usará os endereços IP únicos dos visitantes como chaves do Redis para distinguir a contagem de visitas de cada visitante no servidor Redis.

Na sua janela do terminal, abra um novo arquivo hit_counter.php usando o nano para fins de edição:

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

Com o arquivo hit_counter.php agora criado, abra uma nova tag PHP <?php. Em seguida, dentro de um bloco try {, insira o seguinte código para se conectar ao seu servidor Redis local na porta 6379. Substitua EXAMPLE_PASSWORD pela senha de autenticação do servidor Redis:

/var/www/html/hit_counter.php

<?php

    try {

        $redis = new Redis();
        $redis->connect('127.0.0.1', 6379);
        $redis->auth('EXAMPLE_PASSWORD');

Em seguida, dê um nome de sua escolha ao mapa de hash do Redis ($siteVisitsMap). Este guia usa siteStats para fins de demonstração:

/var/www/html/hit_counter.php

        $siteVisitsMap = 'siteStats';

Depois de definir o mapa de hash do Redis, agora você inicializará uma chave Redis vazia ($visitorHashKey). Em seguida, você a preencherá com os endereços IP dos visitantes. Você usará o valor da variável $visitorHashKey para identificar exclusivamente cada visitante que solicita sua página da 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'];
        }

Neste código, você está usando a declaração if do PHP para determinar o endereço IP do visitante verificando se as variáveis $_SERVER['HTTP_CLIENT_IP'], $_SERVER['HTTP_X_FORWARDED_FOR'] ou $_SERVER['REMOTE_ADDR'] estão preenchidas.

Em seguida, inicialize uma variável $totalVisits para armazenar as visitas totais para cada endereço IP e atribua um valor de 0. Em seguida, use as declarações if (...) {...} else {...} do PHP e $redis->hExists($siteVisitsMap, $visitorHashKey) para verificar se o endereço IP tem alguma entrada no servidor Redis.

Você usará a declaração if ($redis->hExists($siteVisitsMap, $visitorHashKey)) {...} para verificar se um $visitorHashKey existe em um mapa chamado $siteVisitsMap.

Caso o mapa e a chave com o endereço IP nomeado existam no servidor Redis, recupere-os com a declaração $visitorData = $redis->hMget($siteVisitsMap, array($visitorHashKey)); e use $totalVisits = $visitorData[$visitorHashKey] + 1; para incrementar a variável $totalVisits. Você está usando a declaração $redis->hMget para obter dados de contagem de acessos associados a um endereço IP. A função hMget aceita o nome do seu mapa ($siteVisitsMap) e um array das chaves que você deseja recuperar do servidor Redis. Neste caso, você tem apenas uma chave ($visitorHashKey), mas é necessário convertê-la em um array usando a declaração array($visitorHashKey).

Caso seu script encontre o endereço IP pela primeira vez, defina a variável $totalVisits como 1. Por fim, use $redis->hSet($siteVisitsMap, $visitorHashKey, $totalVisits); para definir o valor do $visitorHashKey de acordo com os resultados da declaração if (...) {...} else {...} anterior. A declaração $redis->hSet($siteVisitsMap, $visitorHashKey, $totalVisits) cria um mapa de hash $siteVisitsMap no servidor Redis com uma chave chamada $visitorHashKey com um valor de $totalVisits.

Em seguida, receba o visitante ecoando as visitas totais e feche o bloco } 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();
    }

Uma vez concluído, seu arquivo /var/www/html/hit_counter.php deve ser semelhante ao seguinte código:

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

Grave e feche o arquivo quando terminar de editar. Você agora codificou um script hit_counter.php. Em seguida, você criará outro script PHP que gera um relatório a partir dos dados coletados no mapa de hash do Redis.

Passo 3 — Criando um Script de Relatório de Estatísticas do Site

Depois de coletar dados em um mapa de hash do Redis, pode não fazer sentido se você não puder recuperar e representar as informações em um relatório. Neste passo, você criará um relatório de log para mostrar os diferentes visitantes do site e as visitas totais que fizeram na página web de teste.

Para criar o script de relatório de log, execute nano na sua janela de terminal e crie um novo arquivo /var/www/html/log_report.php:

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

Em seguida, insira as informações abaixo no arquivo. Substitua EXAMPLE_PASSWORD pela senha correta do servidor 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>

Salve e feche o arquivo quando terminar de editar. No script acima, você está se conectando ao servidor Redis e está usando a instrução $redis->HGETALL($siteVisitsMap); para recuperar o mapa de hash das visitas à sua página da web. Em seguida, você está usando o comando PHP foreach ($siteStats as $visitor => $totalVisits) { para fazer um loop e exibir os endereços IP dos visitantes e o número de visitas que eles fizeram ao seu site. Você está usando o comando Redis HGETALL para recuperar todos os campos (endereços IP) e valores (total de visitas por cada endereço IP) do mapa siteVisitsMap.

Agora você tem uma página de teste, um script de contador de visitas e uma página de relatório para verificar as estatísticas do seu site. Em seguida, você testará as funcionalidades do seu contador de visitas para ver se tudo funciona.

Passo 4 — Testando o Contador de Visitas do Redis

Neste passo, você testará toda a lógica do seu contador de visitas. Navegue até a seguinte URL no seu navegador da web. Substitua your-server-IP pelo endereço IP público ou nome de domínio do seu servidor.

http://your-server-IP/test.php

Atualize a página várias vezes usando dispositivos diferentes para gerar estatísticas suficientes. Após cada visita, você deve receber a seguinte saída.

Em seguida, visite a seguinte URL para obter o relatório de visitas ao seu site exibido em uma tabela HTML

http://your-server-IP/log_report.php

Agora você deve ver um relatório semelhante à seguinte saída.

O seu contador de visitas está agora a funcionar como esperado.

Conclusão

Neste guia, configurou um contador de visitas de website com Redis e PHP no seu servidor Ubuntu 20.04.

Como pode ver no código-fonte de exemplo neste guia, o Redis fornece métodos mais limpos para criar e atualizar mapas de hash.

Como mencionado no início deste guia, usar um sistema de gestão de base de dados relacional ainda pode funcionar, mas irá escrever toneladas de código para inserir e atualizar dados nas tabelas subjacentes. Além disso, bases de dados baseadas em disco podem enfrentar problemas de escalabilidade à medida que o seu site cresce.

Para obter mais informações sobre como usar o banco de dados em memória Redis, siga os guias abaixo:

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