Cómo configurar un contador de visitas a un sitio web con Redis y PHP en Ubuntu 20.04

El autor seleccionó a Apache Software Foundation para recibir una donación como parte del programa Write for DOnations .
Introducción
Un contador de visitas es una aplicación que registra e indica el número de visitas que ha recibido tu página web. El contador empieza desde 1 y se incrementa una vez cada vez que se visita una página web.
Para realizar un seguimiento de las visitas, la aplicación de conteo de visitas requiere una forma de base de datos. Si bien los sistemas de administración de bases de datos basados en disco como MySQL pueden funcionar, una base de datos en memoria es mejor en términos de velocidad, rendimiento, escalabilidad, simplicidad y facilidad de uso. Aquí es donde entra en juego el servidor Redis. Redis almacena datos en la RAM de su computadora en lugar de acceder al disco cada vez que realiza una operación de entrada/salida. Esto aumenta significativamente el rendimiento.
Para realizar un seguimiento de las visitas a su sitio, necesita un mapa hash de Redis. Se trata de una estructura de datos que implementa un par clave-valor. Un mapa hash proporciona una tabla hash que asigna claves a valores. Una vez que un usuario visita su página web, usted crea una clave basada en su dirección IP pública o nombre de usuario (para usuarios autenticados) y luego inicializa sus visitas totales con un valor de 1. Luego, cada vez que el usuario vuelve a visitar su página web, usted verifica sus visitas totales desde el mapa hash de Redis en función de su dirección IP/nombre de usuario e incrementa el valor.
En esta guía, configurará un contador de visitas a sitios web con Redis y PHP en su servidor Ubuntu 20.04. Los scripts PHP de esta guía utilizan las direcciones IP públicas de los visitantes para realizar un seguimiento de sus visitas.
Prerrequisitos
Para seguir esta guía, asegúrese de tener lo siguiente:
-
Un servidor Ubuntu 20.04 configurado utilizando la guía Configuración inicial del servidor con Ubuntu 20.04 .
-
Un usuario no root con
sudo
privilegios. Sigue nuestra guía Cómo crear un nuevo usuario habilitado para sudo en Ubuntu 20.04 [Inicio rápido] para configurar un usuario sudo no root. -
Apache y PHP. Para configurarlos, utilice nuestro tutorial Cómo instalar la pila Linux, Apache, MySQL, PHP (LAMP) en Ubuntu 20.04 . Puede omitir el Paso 2 (Instalación de MySQL) y el Paso 4 (Creación de un host virtual para su sitio web) , ya que no necesita una base de datos MySQL ni un host virtual para probar esta guía.
-
Servidor Redis. Lee nuestro tutorial Cómo instalar y proteger Redis en Ubuntu 20.04 [Inicio rápido] para instalar y proteger un servidor Redis.
Paso 1: Instalación de la extensión PHP Redis
En este paso, instalará una extensión de Redis que permite que PHP se comunique con el servidor de Redis. También creará una página web de prueba que implemente el mapa hash de Redis para realizar un seguimiento de las visitas a la web.
Antes de instalar la extensión Redis, actualice el índice de información de paquetes de Ubuntu:
- sudo apt update
Luego, ejecute el siguiente comando para instalar php-redis
. La extensión proporciona una API para comunicarse con el almacén de claves y valores del servidor Redis:
- sudo apt install -y php-redis
Reinicie Apache para cargar la nueva extensión:
- sudo systemctl restart apache2
Ahora ha instalado una extensión PHP que se comunica con su servidor Redis. A continuación, creará una test.php
página web en el directorio raíz del servidor web Apache. Este es solo un archivo de muestra que los visitantes solicitan cuando visitan su sitio web con un navegador. En segundo plano, el test.php
archivo de página carga un hit_counter.php
script que creará más adelante para realizar un seguimiento de las visitas a la página mediante el servidor Redis.
En una situación real, su sitio web podría tener decenas o incluso cientos de páginas web. Para esta guía, creará una sola página web a modo de demostración.
En la ventana de su terminal, utilice nano
para crear un nuevo test.php
archivo en el directorio raíz de su servidor web /var/www/html/
:
- sudo nano /var/www/html/test.php
A continuación, introduzca la siguiente información en el test.php
archivo:
/var/www/html/prueba.php
?php require_once 'hit_counter.php';?!DOCTYPE htmlhtml head titleSample Test Page/title /head body h1Sample test page/h1 pThis is a sample test page./p /body/html
Guarde y cierre el archivo cuando haya terminado de editarlo. En este paso, ha creado una página web HTML simple que carga un hit_counter.php
archivo cuando se la visita. A continuación, codificará el hit_counter.php
archivo para realizar un seguimiento de las visitas a la página de prueba.
Paso 2: creación de un script de contador de visitas de Redis
Cuando se trabaja en un entorno de producción, es muy habitual separar los archivos PHP reutilizables. Esto permite implementar la lógica de estos archivos en diferentes partes del proyecto simplemente incluyendo sus rutas en lugar de copiar y pegar el código. Esto facilita el mantenimiento, ya que solo es necesario editar un único archivo en caso de que sea necesario cambiar la lógica. Esto le ahorra mucho tiempo.
En esta guía, aplicarás la misma estrategia: crearás un único hit_counter.php
archivo que podrás incluir en cualquier página web que requiera el seguimiento de visitantes.
En este archivo, utilizará la php-redis
biblioteca para conectarse al servidor Redis desde PHP. Luego, creará un mapa hash de Redis para almacenar la cantidad de visitas que un visitante realizó a su sitio web. Utilizará las direcciones IP únicas de los visitantes como claves de Redis para distinguir los recuentos de visitas de cada visitante en el servidor Redis.
En la ventana de su terminal, abra un nuevo hit_counter.php
archivo utilizando nano
para fines de edición:
- sudo nano /var/www/html/hit_counter.php
Una vez creado el hit_counter.php
archivo, abra una nueva etiqueta PHP ?php
. Luego, dentro de un try {
bloque, ingrese el siguiente código para conectarse a su servidor Redis local en el puerto 6379
. Reemplace EXAMPLE_PASSWORD
con la contraseña de autenticación para el servidor Redis:
/var/www/html/contador_de_visitas.php
?php try { $redis = new Redis(); $redis-connect('127.0.0.1', 6379); $redis-auth('EXAMPLE_PASSWORD');
A continuación, dale al mapa hash de Redis $siteVisitsMap
un nombre de tu elección. Esta guía utiliza siteStats
para fines de demostración:
/var/www/html/contador_de_visitas.php
$siteVisitsMap = 'siteStats';
Después de definir el mapa hash de Redis, ahora inicializará una clave Redis vacía ( $visitorHashKey
). Luego, la completará con las direcciones IP de los visitantes. Usará el valor de la $visitorHashKey
variable para identificar de forma única a cada visitante que solicite su página web:
/var/www/html/contador_de_visitas.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']; }
En este código, estás usando la if
declaración PHP para determinar la dirección IP del visitante verificando si las variables $_SERVER['HTTP_CLIENT_IP']
, $_SERVER['HTTP_X_FORWARDED_FOR']
o $_SERVER['REMOTE_ADDR']
están completas.
A continuación, inicializa una $totalVisits
variable para almacenar el total de visitas de cada dirección IP y asígnale un valor de 0. Luego, utiliza las instrucciones PHP if (...) {...} else {...}
y $redis-hExists($siteVisitsMap, $visitorHashKey)
para verificar si la dirección IP tiene alguna entrada en el servidor Redis.
Utilizará la declaración if ($redis-hExists($siteVisitsMap, $visitorHashKey)) {...}
para verificar si a $visitorHashKey
existe en un mapa llamado $siteVisitsMap
.
En caso de que el mapa y la clave con la dirección IP nombrada existan en el servidor Redis, recupérelos con la declaración $visitorData = $redis-hMget($siteVisitsMap, array($visitorHashKey));
y use $totalVisits = $visitorData[$visitorHashKey] + 1;
para incrementar la $totalVisits
variable. Está usando la $redis-hMget
declaración para obtener datos de recuento de visitas asociados con una dirección IP. La hMget
función acepta el nombre de su mapa ( $siteVisitsMap
) y una matriz de las claves que desea recuperar del servidor Redis. En este caso, solo tiene una clave ( $visitorHashKey
), pero debe convertirla en una matriz usando la declaración array($visitorHashKey)
.
En caso de que su script encuentre la dirección IP por primera vez, configure la $totalVisits
variable en 1. Finalmente, use $redis-hSet($siteVisitsMap, $visitorHashKey, $totalVisits);
para configurar el valor de $visitorHashKey
según los resultados de la if (...) {...} else {...}
declaración anterior. La $redis-hSet($siteVisitsMap, $visitorHashKey, $totalVisits)
declaración crea un $siteVisitsMap
mapa hash en el servidor Redis con una clave denominada $visitorHashKey
con un valor de $totalVisits
.
Luego, da la bienvenida al visitante haciendo eco del total de visitas y cierra el } catch (...) {...}
bloque:
/var/www/html/contador_de_visitas.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 . " timesn"; } catch (Exception $e) { echo $e-getMessage(); }
Una vez completado, su /var/www/html/hit_counter.php
archivo debería ser similar al siguiente código:
/var/www/html/contador_de_visitas.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 . " timesn"; } catch (Exception $e) { echo $e-getMessage(); }
Guarde y cierre el archivo cuando haya terminado de editarlo. Ya ha codificado un hit_counter.php
script. A continuación, creará otro script PHP que genere un informe a partir de los datos recopilados en el mapa hash de Redis.
Paso 3: Creación de un script de informe de estadísticas del sitio
Una vez que haya recopilado datos en un mapa hash de Redis, es posible que no tenga sentido si no puede recuperar y representar la información en un informe. En este paso, creará un informe de registro para mostrar los diferentes visitantes del sitio y las visitas totales que realizaron en la página web de prueba.
Para crear el script de informe de registro, ejecútelo nano
en la ventana de su terminal y cree un nuevo /var/www/html/log_report.php
archivo:
- sudo nano /var/www/html/log_report.php
Luego, ingrese la siguiente información en el archivo. Reemplácela EXAMPLE_PASSWORD
con la contraseña correcta para el servidor Redis:
/var/www/html/log.php
!DOCTYPE htmlhtml head titleSite Visits Report/title /head body h1Site Visits Report/h1 table border = '1' tr thNo./th thVisitor/th thTotal 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
Guarda y cierra el archivo cuando hayas terminado de editarlo. En el script anterior, te estás conectando al servidor Redis y estás usando la declaración $redis-HGETALL($siteVisitsMap);
para recuperar el mapa hash de las visitas a tu página web. Luego, estás usando la foreach ($siteStats as $visitor = $totalVisits) {
declaración PHP para hacer un bucle y mostrar las direcciones IP de los visitantes y la cantidad de visitas que han realizado a tu sitio. Estás usando el comando Redis HGETALL
para recuperar todos los campos (direcciones IP) y valores (visitas totales por cada dirección IP) del siteVisitsMap
mapa.
Ahora tienes una página de prueba, un script de contador de visitas y una página de informes para comprobar las estadísticas de tu sitio. A continuación, probarás las funcionalidades de tu contador de visitas y verás si todo funciona.
Paso 4: Prueba del contador de visitas de Redis
En este paso, probará toda la lógica de su contador de visitas. Navegue hasta la siguiente URL en su navegador web. Reemplácela your-server-IP
con la dirección IP pública o el nombre de dominio de su servidor.
http://your-server-IP/test.php
Actualice la página varias veces con distintos dispositivos para generar suficientes estadísticas. Después de cada visita, debería recibir el siguiente resultado.
A continuación, visite la siguiente URL para obtener el informe de visitas a su sitio en una tabla HTML
http://your-server-IP/log_report.php
Ahora debería ver un informe similar al siguiente.
Su contador de visitas ahora funciona como se esperaba.
Conclusión
En esta guía, ha configurado un contador de visitas a sitios web con Redis y PHP en su servidor Ubuntu 20.04.
Como puede ver en el código fuente de muestra en esta guía, Redis proporciona métodos más limpios para crear y actualizar mapas hash.
Como se mencionó al principio de esta guía, el uso de un sistema de administración de bases de datos relacionales puede funcionar, pero deberá escribir una gran cantidad de código para insertar y actualizar datos en las tablas subyacentes. Además, las bases de datos basadas en discos pueden experimentar problemas de escalabilidad cuando su sitio crezca.
Para obtener más información sobre el uso de la base de datos en memoria Redis, siga las guías a continuación:
- Cómo configurar Redis como caché para MySQL con PHP en Ubuntu 20.04
- Cómo migrar datos de Redis a una base de datos administrada por DigitalOcean
Deja una respuesta