Веб-аналитика с использованием PHP: практическое руководство

Раздел: Веб-разработка на PHP -> Аналитика на PHP

Аналитика на PHP: подходы и инструменты

Основное решение: использование библиотеки PHP-ML для машинного обучения и анализа данных

PHP-ML позволяет строить модели прогнозирования, классификации и кластеризации непосредственно на PHP. Для аналитики веб-проекта это может быть полезно для предсказания оттока пользователей, сегментации аудитории или определения аномалий в поведении.

require_once __DIR__ . '/vendor/autoload.php';

use Phpml\Regression\LeastSquares;

$samples = [[1], [2], [3], [4], [5]];
$targets = [2, 4, 6, 8, 10];

$regression = new LeastSquares();
$regression->train($samples, $targets);

echo $regression->predict([6]); // 12

Analytics php (аналитика на php)

Результат: 12

В данном примере линейная регрессия обучается на данных о посещениях (день - количество визитов) и предсказывает значение на 6 день. Проблемы: необходимость предварительной обработки данных, точность модели зависит от объема и качества данных. Типичная ошибка - передача нечисловых данных без нормализации.

Как собрать базовую статистику посещений без базы данных?

Вариант с логированием в файл и ручным парсингом. Используется для небольших проектов, где не требуется высокая производительность.

// Логирование в файл
$log = date('Y-m-d H:i:s') . ' | ' . $_SERVER['REMOTE_ADDR'] . ' | ' . $_SERVER['REQUEST_URI'] . "\n";
file_put_contents('stats.log', $log, FILE_APPEND);

// Чтение и анализ
$lines = file('stats.log');
$count = count($lines);
echo "Всего записей: $count";

Как хранить и агрегировать события для последующего анализа?

// MySQL: создание таблицы событий
CREATE TABLE events (
    id INT AUTO_INCREMENT PRIMARY KEY,
    event_name VARCHAR(100),
    user_ip VARCHAR(45),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

// Вставка события
$pdo = new PDO('mysql:host=localhost;dbname=analytics', 'user', 'pass');
$stmt = $pdo->prepare('INSERT INTO events (event_name, user_ip) VALUES (?, ?)');
$stmt->execute(['page_view', $_SERVER['REMOTE_ADDR']]);

// Агрегация
$result = $pdo->query('SELECT COUNT(*) as total FROM events');
$row = $result->fetch();
echo "Всего событий: " . $row['total'];

Проблемы: при большом количестве событий таблица быстро растет. Решение: использовать партиционирование или агрегировать данные в отдельные таблицы каждую минуту/час. Типичная ошибка - неэффективные запросы без индексов.

Как получать аналитические данные из Google Analytics на PHP?

Через API Google Analytics Data API (GA4). Необходим сервисный аккаунт и доступ к свойству.

require 'vendor/autoload.php';

use Google\Analytics\Data\V1beta\BetaAnalyticsDataClient;
use Google\Analytics\Data\V1beta\DateRange;
use Google\Analytics\Data\V1beta\Metric;

$client = new BetaAnalyticsDataClient(['credentials' => 'path/to/service-account.json']);

$response = $client->runReport([
    'property' => 'properties/123456789',
    'dateRanges' => [new DateRange(['start_date' => '7daysAgo', 'end_date' => 'today'])],
    'metrics' => [new Metric(['name' => 'activeUsers'])]
]);

foreach ($response->getRows() as $row) {
    echo 'Active users: ' . $row->getMetricValues()[0]->getValue();
}

Как отправлять регулярные отчеты по email с данными аналитики?

Используется PHPMailer для формирования и отправки отчетов.

use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setCellValue('A1', 'Дата');
$sheet->setCellValue('B1', 'Посетители');

// заполнение данными ...

$writer = new Xlsx($spreadsheet);
$writer->save('report.xlsx');

// Отправка PHPMailer
$mail = new PHPMailer\PHPMailer\PHPMailer();
$mail->addAttachment('report.xlsx');
$mail->send();

Расширенные примеры аналитики на PHP

Отправка пользовательских событий в Google Analytics через Measurement Protocol

Позволяет отслеживать серверные события (например, завершение оплаты) без использования клиентских скриптов.

Пример
$clientId = bin2hex(random_bytes(8));
$payload = [
    'v' => 1,
    'tid' => 'G-XXXXXXXXXX',
    'cid' => $clientId,
    't' => 'event',
    'ec' => 'purchase',
    'ea' => 'completed',
    'el' => 'order_123',
    'ev' => 100
];

$ch = curl_init('https://www.google-analytics.com/collect');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($payload));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);

echo "Event sent";
Результат: Event sent (статус 200, если всё корректно)

Важно: GA4 требует другой протокол (gtag или Google Analytics Data API). Для Universal Analytics (UA) используется указанный выше. При миграции на GA4 нужно переписать логику.

Построение простого графика количества посещений с помощью GD Library

Полезно, когда нет возможности подключать внешние сервисы визуализации.

Пример
$data = [10, 25, 15, 30, 20, 35];
$width = 400;
$height = 200;
$image = imagecreatetruecolor($width, $height);
$white = imagecolorallocate($image, 255, 255, 255);
$blue = imagecolorallocate($image, 0, 0, 255);
imagefill($image, 0, 0, $white);

$max = max($data);
$padding = 20;
$stepX = ($width - $padding * 2) / (count($data) - 1);
$stepY = ($height - $padding * 2) / $max;

foreach ($data as $i => $value) {
    $x = $padding + $i * $stepX;
    $y = $height - $padding - $value * $stepY;
    imagefilledellipse($image, $x, $y, 5, 5, $blue);
    if ($i > 0) {
        $prevX = $padding + ($i - 1) * $stepX;
        $prevY = $height - $padding - $data[$i - 1] * $stepY;
        imageline($image, $prevX, $prevY, $x, $y, $blue);
    }
}

header('Content-Type: image/png');
imagepng($image);
imagedestroy($image);
Результат: графическое изображение (PNG) с точками и соединительными линиями.

Анализ логов веб-сервера (nginx) для выявления популярных страниц

Парсинг access.log с использованием регулярных выражений.

Пример
$logFile = '/var/log/nginx/access.log';
$handle = fopen($logFile, 'r');
$pages = [];

while (($line = fgets($handle)) !== false) {
    if (preg_match('/^\S+ \S+ \S+ \[.*\] "GET (\S+) HTTP/', $line, $matches)) {
        $url = $matches[1];
        $pages[$url] = isset($pages[$url]) ? $pages[$url] + 1 : 1;
    }
}
fclose($handle);

arsort($pages);
echo "Top 10 страниц:\n";
$i = 0;
foreach ($pages as $url => $count) {
    if ($i++ >= 10) break;
    echo htmlspecialchars($url) . " - $count\n";
}
Результат: список из 10 самых популярных URL с количеством запросов (по убыванию).

Ошибки: игнорирование строк с POST-запросами, кодировка URL, большие файлы - потребляют память. Для больших логов рекомендуется использовать потоковую обработку без загрузки всего файла в память.

Аналитика на PHP - comments

En
Analytics php (php)