Веб-аналитика с использованием 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, большие файлы - потребляют память. Для больших логов рекомендуется использовать потоковую обработку без загрузки всего файла в память.