"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > Cómo resolví un problema de backend desafiante con PHP y MySQL

Cómo resolví un problema de backend desafiante con PHP y MySQL

Publicado el 2024-07-31
Navegar:331

How I Solved a Challenging Backend Problem with PHP & MySQL

Hola, ha pasado un tiempo desde que escribí una publicación en el blog; bueno, aquí estoy escribiendo sobre uno de los problemas más desafiantes que encontré y una descripción general de cómo lo resolví.

Como desarrollador backend, no puedes escapar de los desafíos, especialmente aquellos que te entusiasmarán. Recientemente, mientras trabajaba en una red publicitaria usando PHP y MySQL, me encontré con un problema complejo relacionado con la optimización del costo por mil (CPM) para los editores según criterios específicos. Este problema puso a prueba mis habilidades técnicas y brindó una experiencia de aprendizaje invaluable. En esta publicación, le explicaré cómo resolví este problema paso a paso, destacando los desafíos que enfrenté y las soluciones implementadas. Estaré encantado si hay sugerencias que pueda recibir sobre cómo implementar de manera eficiente o una mejor manera de hacerlo.

El problema

La tarea consistía en ajustar el CPM del editor según los siguientes criterios:

  1. Aumento del 5% si hay clics de 10 direcciones IP diferentes en los últimos 10 minutos.
  2. Disminución del 8% si hay clics desde la misma dirección IP 5 veces en los últimos 10 minutos.
  3. Aumento del 2% si hay 10 clics consecutivos del mismo país.

El viaje de la solución

Paso 1: comprender los requisitos

Antes de lanzarme a la implementación, necesitaba tener una comprensión clara de los requisitos. Discutí con las partes interesadas para confirmar los criterios y el comportamiento deseado para ajustar el CPM. Este paso inicial fue crucial para planificar la solución de forma eficaz.

Paso 2: configurar la base de datos

Ya tengo mi base de datos y tablas creadas, además, el proyecto ya estaba activo, así que solo necesitaba agregar los criterios. Me aseguré de que la base de datos y la tabla estuvieran configuradas para almacenar y acomodar la información necesaria para el seguimiento de los clics. El esquema de la tabla incluía campos para almacenar la marca de tiempo del clic, la dirección IP y el código de país (hay otros campos/columnas que no incluiría porque no son realmente importantes para el motivo de esta publicación).

Paso 3: capturar datos de clics

A continuación, implementé una función para obtener y guardar la dirección IP y el código de país cada vez que un usuario hace clic en un anuncio. Estos datos se almacenaron en la tabla de clics.

Paso 4: Implementación de las verificaciones de criterios

Una vez capturados los datos, el siguiente paso fue implementar la lógica para verificar los criterios y ajustar el CPM en consecuencia.

  1. Comprobación de direcciones IP únicas Cuento las direcciones IP únicas en los últimos 10 minutos usando la función COUNT y la palabra clave DISTINCT que evalúa la expresión de cada fila de un grupo y devuelve el número de valores únicos y no nulos. .
/** 
 * Get the count of unique IP addresses in the last 10 minutes
 */
$stmt = $pdo->prepare("
    SELECT COUNT(DISTINCT ip_address) AS unique_ips
    FROM clicks
    WHERE date_time >= NOW() - INTERVAL 10 MINUTE
");
$stmt->execute();
$unique_ips = $stmt->fetchColumn();

if ($unique_ips >= 10) {
    $cpm *= 1.05;
} else {
    /**
     * Here, I check for clicks from the same IP address
     * This is in the second condition
     * ...
     **/
}
  1. Comprobación de direcciones IP repetidas Luego verifico si hay direcciones IP repetidas o no únicas en los últimos 10 minutos usando la función SQL COUNT.
/** 
 * Checking non-unique (repeated) IP addresses in the last 10 minutes
 * If the condition is true, decrease the CPM by 8%
 */
$stmt = $pdo->prepare("
    SELECT ip_address, COUNT(*) AS click_count
    FROM clicks
    WHERE timestamp >= NOW() - INTERVAL 10 MINUTE
    GROUP BY ip_address
    HAVING click_count >= 5
");
$stmt->execute();
$repeated_ips = $stmt->fetchAll();

if (count($repeated_ips) > 0) {
    $cpm *= 0.92;
} else {
    /**
     * Here, I check for consecutive clicks from the same country
     * This is in the third condition
     * ...
     **/
}
  1. Comprobación de clics consecutivos del mismo país Aquí aplico el tercer criterio, que es comprobar si hay clics consecutivos del mismo país.
/** 
 * Checking clicks from the same country consecutively
 * If the condition is true, increase the CPM by 2%
 */
$stmt = $pdo->prepare("
    SELECT country_code
    FROM clicks
    ORDER BY timestamp DESC
    LIMIT 10
");
$stmt->execute();
$last_ten_clicks = $stmt->fetchAll(PDO::FETCH_COLUMN);

if (count(array_unique($last_ten_clicks)) === 1) {
    $cpm *= 1.02;
}

Paso 5: actualizar el CPM

Para esta parte, actualizo el CPM del editor y lo uso para calcular sus ganancias por ese clic en particular.

El resultado

Al implementar esta solución, la red publicitaria ahora ajusta dinámicamente el CPM en función de los datos de clics del usuario. Esto garantiza un modelo de ingresos justo y optimizado para los editores, mejorando la eficacia general de la red publicitaria.

¿Acerca de mí y por qué la pasantía en HNG?

Soy Kingsley Gbutemu Kefas, un desarrollador backend apasionado por crear sistemas escalables y eficientes. Soy solucionador de problemas, me encanta aprender cosas nuevas y formas de hacer algo. Como desarrollador, me motiva resolver desafíos, especialmente aquellos complejos que me hagan pensar críticamente. Sé que HNG Internship es una oportunidad para crecer como desarrollador trabajando en proyectos del mundo real y aprendiendo de expertos de la industria. Estoy emocionado de comenzar mi viaje con HNG Internship y contribuir a la comunidad tecnológica. Creo que este viaje mejorará mis habilidades y contribuirá a proyectos impactantes y estoy seguro de que me beneficiaré más de los beneficios de HNG Premium.

Declaración de liberación Este artículo se reproduce en: https://dev.to/cyberking99/solving-a-challenging-backend-problem-with-php-h0l?1 Si hay alguna infracción, comuníquese con [email protected] para eliminarla.
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3