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

Índice
  1. Introducción
  • Prerrequisitos
  • Paso 1: Instalación de la extensión PHP Redis
  • Paso 2: creación de un script de contador de visitas de Redis
  • Paso 3: Creación de un script de informe de estadísticas del sitio
  • Paso 4: Prueba del contador de visitas de Redis
  • Conclusión
  • 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 sudoprivilegios. 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:

    1. 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:

    1. sudo apt install -y php-redis

    Reinicie Apache para cargar la nueva extensión:

    1. sudo systemctl restart apache2

    Ahora ha instalado una extensión PHP que se comunica con su servidor Redis. A continuación, creará una test.phppá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.phparchivo de página carga un hit_counter.phpscript 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 nanopara crear un nuevo test.phparchivo en el directorio raíz de su servidor web /var/www/html/:

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

    A continuación, introduzca la siguiente información en el test.phparchivo:

    /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.phparchivo cuando se la visita. A continuación, codificará el hit_counter.phparchivo 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.phparchivo que podrás incluir en cualquier página web que requiera el seguimiento de visitantes.

    En este archivo, utilizará la php-redisbiblioteca 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.phparchivo utilizando nanopara fines de edición:

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

    Una vez creado el hit_counter.phparchivo, 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_PASSWORDcon 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 $siteVisitsMapun nombre de tu elección. Esta guía utiliza siteStatspara 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 $visitorHashKeyvariable 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 ifdeclaració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 $totalVisitsvariable 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 $visitorHashKeyexiste 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 $totalVisitsvariable. Está usando la $redis-hMgetdeclaración para obtener datos de recuento de visitas asociados con una dirección IP. La hMgetfunció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 $totalVisitsvariable en 1. Finalmente, use $redis-hSet($siteVisitsMap, $visitorHashKey, $totalVisits);para configurar el valor de $visitorHashKeysegún los resultados de la if (...) {...} else {...}declaración anterior. La $redis-hSet($siteVisitsMap, $visitorHashKey, $totalVisits)declaración crea un $siteVisitsMapmapa hash en el servidor Redis con una clave denominada $visitorHashKeycon 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.phparchivo 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.phpscript. 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 nanoen la ventana de su terminal y cree un nuevo /var/www/html/log_report.phparchivo:

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

    Luego, ingrese la siguiente información en el archivo. Reemplácela EXAMPLE_PASSWORDcon 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 HGETALLpara recuperar todos los campos (direcciones IP) y valores (visitas totales por cada dirección IP) del siteVisitsMapmapa.

    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-IPcon 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
    SUSCRÍBETE A NUESTRO BOLETÍN 
    No te pierdas de nuestro contenido ni de ninguna de nuestras guías para que puedas avanzar en los juegos que más te gustan.

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

    Subir

    Este sitio web utiliza cookies para mejorar tu experiencia mientras navegas por él. Este sitio web utiliza cookies para mejorar tu experiencia de usuario. Al continuar navegando, aceptas su uso. Mas informacion