«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как я решил сложную проблему с серверной частью с помощью PHP и MySQL

Как я решил сложную проблему с серверной частью с помощью PHP и MySQL

Опубликовано 31 июля 2024 г.
Просматривать:426

How I Solved a Challenging Backend Problem with PHP & MySQL

Привет, я давно не писал постов в блоге; ну, здесь я пишу об одной из самых сложных проблем, с которыми я столкнулся, и о том, как я ее решил.

Бэкэнд-разработчику невозможно избежать проблем, особенно тех, которые заставят вас взволноваться. Недавно, работая над рекламной сетью с использованием PHP и MySQL, я столкнулся со сложной проблемой, связанной с оптимизацией цены за тысячу показов (CPM) для издателей на основе определенных критериев. Эта задача проверила мои технические навыки и предоставила бесценный опыт обучения. В этом посте я шаг за шагом расскажу вам, как я решил эту проблему, подчеркнув стоящие перед ней проблемы и реализованные решения. Я буду рад, если у меня есть предложения о том, как эффективно реализовать это или лучший способ это сделать.

Проблема

Задачей было скорректировать цену за тысячу показов издателя по следующим критериям:

  1. Увеличение на 5%, если за последние 10 минут были клики с 10 разных IP-адресов.
  2. Снижение на 8 %, если за последние 10 минут с одного и того же IP-адреса было получено пять кликов.
  3. Увеличение на 2 %, если из одной страны получено 10 последовательных кликов.

Путь к решению

Шаг 1: Понимание требований

Прежде чем приступить к реализации, мне нужно было четко понять требования. Я обсудил с заинтересованными сторонами, чтобы подтвердить критерии и желаемое поведение для корректировки CPM. Этот первоначальный шаг имел решающее значение для эффективного планирования решения.

Шаг 2. Настройка базы данных

У меня уже созданы база данных и таблицы, кроме того, проект уже был запущен, поэтому мне просто нужно было добавить критерии. Я позаботился о том, чтобы база данных и таблица были настроены для хранения и размещения необходимой информации для отслеживания кликов. Схема таблицы включала поля для хранения отметки времени клика, IP-адреса и кода страны (есть и другие поля/столбцы, которые я бы не стал включать, потому что они не очень важны для смысла этого поста).

Шаг 3. Сбор данных о кликах

Затем я реализовал функцию, позволяющую получать и сохранять IP-адрес и код страны каждый раз, когда пользователь нажимает на объявление. Эти данные хранились в таблице кликов.

Шаг 4. Реализация проверок критериев

После сбора данных следующим шагом стала реализация логики для проверки критериев и соответствующей корректировки цены за тысячу показов.

  1. Проверка уникальных IP-адресов Я подсчитываю уникальные IP-адреса за последние 10 минут с помощью функции COUNT и ключевого слова DISTINCT, которое оценивает выражение для каждой строки в группе и возвращает количество уникальных, ненулевых значений. .
/** 
 * 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. Проверка повторяющихся IP-адресов Затем я проверяю повторяющиеся или неуникальные IP-адреса за последние 10 минут с помощью функции 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. Проверка последовательных кликов из одной страны Здесь я применяю третий критерий — проверку последовательных кликов из одной и той же страны.
/** 
 * 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;
}

Шаг 5. Обновление цены за тысячу показов

На этом этапе я обновляю цену за тысячу показов издателя и использую ее для расчета его дохода за этот конкретный клик.

Исход

Благодаря внедрению этого решения рекламная сеть теперь динамически корректирует цену за тысячу показов на основе данных о кликах пользователя. Это обеспечивает справедливую и оптимизированную модель дохода для издателей, повышая общую эффективность рекламной сети.

Обо мне и почему стажировка в HNG?

Я Кингсли Гбутему Кефас, бэкэнд-разработчик, увлеченный созданием масштабируемых и эффективных систем. Я умею решать проблемы, мне нравится узнавать что-то новое и способы что-то делать. Меня как разработчика мотивирует решение задач, особенно сложных, которые заставляют меня критически мыслить. Я знаю, что стажировка в HNG — это возможность для меня вырасти как разработчик, работая над реальными проектами и обучаясь у экспертов отрасли. Я очень рад начать свой путь со стажировки в HNG и внести свой вклад в технологическое сообщество. Я верю, что это путешествие отточит мои навыки и будет способствовать реализации эффективных проектов, и я уверен, что я получу больше пользы от преимуществ HNG Premium.

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/cyberking99/solve-a-challenging-backend-problem-with-php-h0l?1. Если есть какие-либо нарушения, свяжитесь с [email protected], чтобы удалить их.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3