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:
-
Um servidor Ubuntu 20.04 configurado usando o guia Configuração Inicial do Servidor com Ubuntu 20.04.
-
Um usuário não root com privilégios de
sudo
. Siga nosso guia Como Criar um Novo Usuário Habilitado para Sudo no Ubuntu 20.04 [Início Rápido] para configurar um usuário sudo não root. -
Apache e PHP. Para configurar esses, use nosso tutorial Como Instalar o Conjunto de Software Linux, Apache, MySQL, PHP (LAMP) no Ubuntu 20.04. Você pode pular Passo 2 — Instalando o MySQL e Passo 4 — Criando um Host Virtual para seu Site pois você não precisa de um banco de dados MySQL ou um host virtual para testar este guia.
-
Servidor Redis. Leia nosso tutorial Como Instalar e Proteger o Redis no Ubuntu 20.04 [Inicialização Rápida] para instalar e proteger um servidor Redis.
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:
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:
Reinicie o Apache para carregar a nova extensão:
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/
:
Em seguida, insira as seguintes informações no arquivo 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:
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:
<?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:
$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:
$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 (...) {...}
:
$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:
<?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
:
Em seguida, insira as informações abaixo no arquivo. Substitua EXAMPLE_PASSWORD
pela senha correta do servidor 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>
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: