Реализация отслеживания рекламных кликов на PHP для веб-аналитики

Раздел: Веб-аналитика -> Рекламный трекинг

Основные варианты отслеживания рекламных кликов

Цель: зафиксировать факт перехода пользователя по рекламной ссылке, передать параметры рекламной кампании и сохранить данные для последующего анализа.

Наиболее эффективное решение: пиксельный трекинг через PHP-скрипт с записью в базу данных

Этот метод использует невидимое изображение 1×1, которое запрашивается браузером при загрузке страницы после клика. PHP-скрипт принимает GET-параметры (utm_source, utm_campaign, referrer и т.д.) и сохраняет их в MySQL. Решение независимо от JavaScript, работает при отключенном JS.

Пошаговая реализация

  1. Создать таблицу для хранения кликов.
  2. Написать скрипт track.php, который принимает параметры, проверяет их и вставляет запись.
  3. В рекламной ссылке указывать URL вида https://site.com/track.php?target=https://site.com/landing&utm_source=google&utm_campaign=summer.
  4. Скрипт перенаправляет пользователя на целевую страницу, отправляя заголовок Location, и одновременно логирует клик (можно в фоновом режиме через fastcgi_finish_request или запись в лог-файл).

Код примера

Файл track.php (основная логика):


<?php
// Получаем целевой URL и параметры
$target = isset($_GET['target']) ? $_GET['target'] : '/';
$utm_source = isset($_GET['utm_source']) ? $_GET['utm_source'] : '';
$utm_campaign = isset($_GET['utm_campaign']) ? $_GET['utm_campaign'] : '';
$referrer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '';

// Сохраняем в базу данных (PDO)
try {
    $pdo = new PDO('mysql:host=localhost;dbname=analytics', 'user', 'pass');
    $stmt = $pdo->prepare('INSERT INTO clicks (timestamp, target_url, utm_source, utm_campaign, referrer, ip) VALUES (NOW(), ?, ?, ?, ?, ?)');
    $stmt->execute([$target, $utm_source, $utm_campaign, $referrer, $_SERVER['REMOTE_ADDR']]);
} catch (PDOException $e) {
    // Логирование ошибки без прерывания редиректа
    error_log('DB error: ' . $e->getMessage());
}

// Перенаправляем пользователя на целевую страницу
header('Location: ' . $target, true, 302);
?>

Ads php clicks (отслеживание рекламных кликов в php)

На странице, куда ведет редирект, можно разместить пиксель для фиксации загрузки (дополнительное подтверждение клика).

Как отследить клик с помощью JavaScript и AJAX-запроса?

Если требуется более детальная информация (время до клика, координаты) или необходимо работать с динамическими ссылками, используется JavaScript. На ссылку вешается обработчик click, который отправляет асинхронный запрос на PHP-скрипт, а затем переходит по ссылке.

Пример


<script>
document.querySelectorAll('a.tracked').forEach(function(link) {
    link.addEventListener('click', function(e) {
        e.preventDefault();
        var targetUrl = this.href;
        var xhr = new XMLHttpRequest();
        xhr.open('GET', '/track.php?url=' + encodeURIComponent(targetUrl) + '&utm_source=' + encodeURIComponent('js'), true);
        xhr.onload = function() {
            window.location.href = targetUrl;
        };
        xhr.onerror = function() {
            window.location.href = targetUrl; // fallback
        };
        xhr.send();
    });
});
</script>

Проблема: Если браузер завершит страницу до ответа сервера, запрос может быть отменен. Решение: использовать техники keepalive или отправлять данные через Beacon API.

Ошибка: Неправильное кодирование URL приводит к потере параметров. Используйте encodeURIComponent.

Как использовать mod_rewrite и редиректы для отслеживания?

На сервере Apache можно настроить правила .htaccess, которые перенаправляют все запросы к определённому пути через PHP-скрипт, не меняя ссылки в рекламе. Например, все ссылки вида /go/ обрабатываются трекером.

Пример .htaccess


RewriteEngine On
RewriteRule ^go/(.*)$ /track.php?url=$1&via=htaccess [L,QSA]

В PHP остаётся только разобрать параметр url и перенаправить.

Проблема: Если целевой URL содержит кодировку или спецсимволы, RewriteRule может неправильно обработать. Решение: использовать флаг [B] для экранирования.

Как реализовать отслеживание через серверные логи (access.log)?

Можно анализировать логи веб-сервера с помощью парсера на PHP. Каждый клик по рекламной ссылке (например, /redirect?to=...) оставляет запись в access.log. Парсер извлекает нужные поля и загружает в БД.

Пример парсинга access.log


$logFile = '/var/log/apache2/access.log';
$handle = fopen($logFile, 'r');
while (!feof($handle)) {
    $line = fgets($handle);
    if (preg_match('/GET \/redirect\?to=([^\s]+)/', $line, $matches)) {
        // сохраняем $matches[1] как целевой URL
        // также можно извлечь IP, referrer, user agent
    }
}
fclose($handle);

Проблема: Высокая нагрузка при чтении больших логов. Решение: использовать потоковую обработку с позицией (tail -f) или утилиты вроде GoAccess.

Расширенный пример: интеграция с внешним сервисом аналитики

Реализация отслеживания кликов с передачей данных в Google Analytics через Measurement Protocol.

Пример

function sendToGA($clientId, $campaign, $source) {
    $payload = array(
        'v' => 1,
        'tid' => 'UA-XXXXX-Y',
        'cid' => $clientId,
        't' => 'pageview',
        'dh' => 'example.com',
        'dp' => '/landing',
        'cs' => $source,
        'cm' => $campaign,
        'cn' => 'summer2024'
    );
    $ch = curl_init('https://www.google-analytics.com/collect');
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($payload));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_exec($ch);
    curl_close($ch);
}

Вызов после записи в локальную БД:

Пример

sendToGA('12345.67890', 'summer', 'google');

Комбинированный трекинг с использованием Redis

Для снижения нагрузки на БД можно сначала сохранять клики в Redis (список), а затем асинхронно переносить в MySQL.

Пример

$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$clickData = json_encode([
    'time' => time(),
    'ip' => $_SERVER['REMOTE_ADDR'],
    'url' => $_GET['target']
]);
$redis->rpush('clicks_queue', $clickData);

Отдельный скрипт (worker) читает очередь и вставляет в БД:

Пример

while ($data = $redis->lpop('clicks_queue')) {
    $record = json_decode($data, true);
    // запись в MySQL
}

Отслеживание кликов через куки и уникальные идентификаторы

Для связывания кликов с последующими действиями (конверсии) можно присваивать каждому клику уникальный ID и сохранять его в cookie.

Пример

$clickId = bin2hex(random_bytes(16));
setcookie('click_id', $clickId, time() + 86400 * 30, '/');
// запись в БД с click_id

На странице благодарности после заказа:

Пример

$clickId = $_COOKIE['click_id'] ?? null;
if ($clickId) {
    // обновить запись о клике, добавив конверсию
}

Пример с защитой от повторной отправки (nonce)

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

Пример

session_start();
$token = bin2hex(random_bytes(8));
$_SESSION['click_token'] = $token;
// ссылка вида: /track.php?target=...&token=...

При обработке:

Пример

if ($_GET['token'] !== $_SESSION['click_token']) {
    die('Token invalid');
}
unset($_SESSION['click_token']);

Отслеживание кликов с помощью webp ресурса

Вместо GIF-пикселя можно использовать изображение в формате WebP, которое меньше размером и поддерживается современными браузерами.

Пример

// track.php отвечает изображением (base64)
header('Content-Type: image/webp');
// пустой webp (1x1)
echo base64_decode('UklGRiQAAABXRUJQVlA4IBgAAAAwAQCdASoBAAEAAQAcAwoAA2lkIQM=');

Отслеживание рекламных кликов в PHP - comments

En
Ads php clicks (php)