69 lines
2.1 KiB
PHP
69 lines
2.1 KiB
PHP
<?php
|
||
/**
|
||
* @package Bicycle
|
||
* @author Egor Isaev
|
||
* @description Profiler.php
|
||
* @copyright (c) 07/08/2026
|
||
*/
|
||
|
||
namespace Services\DataBase\Classes;
|
||
|
||
/**
|
||
* Накопитель таймингов запросов к БД — статический реестр на весь запрос
|
||
* (по образцу Log). Backend-agnostic сам по себе (принимает произвольный $driver),
|
||
* заполняется адаптерами вроде ProfilerPDO.
|
||
*/
|
||
class Profiler
|
||
{
|
||
/** @var array<int,array{sql:string,params:array,time_ms:float,driver:string}> */
|
||
private static array $_entries = [];
|
||
|
||
/**
|
||
* Добавляет запись о выполненном запросе.
|
||
*
|
||
* @param string $sql SQL-запрос
|
||
* @param array $params Параметры запроса
|
||
* @param float $time_ms Время выполнения в миллисекундах
|
||
* @param string $driver Имя драйвера (для отчёта, если профилируются разные бэкенды)
|
||
* @return void
|
||
*/
|
||
public static function log(string $sql, array $params, float $time_ms, string $driver = 'pdo'): void
|
||
{
|
||
self::$_entries[] = ['sql' => $sql, 'params' => $params, 'time_ms' => $time_ms, 'driver' => $driver];
|
||
}
|
||
|
||
/**
|
||
* @return array<int,array{sql:string,params:array,time_ms:float,driver:string}>
|
||
*/
|
||
public static function entries(): array
|
||
{
|
||
return self::$_entries;
|
||
}
|
||
|
||
/**
|
||
* @return float Суммарное время всех залогированных запросов, мс
|
||
*/
|
||
public static function totalTime(): float
|
||
{
|
||
return array_sum(array_column(self::$_entries, 'time_ms'));
|
||
}
|
||
|
||
/**
|
||
* @return int Число залогированных запросов
|
||
*/
|
||
public static function count(): int
|
||
{
|
||
return count(self::$_entries);
|
||
}
|
||
|
||
/**
|
||
* Очищает накопленные записи.
|
||
*
|
||
* @return void
|
||
*/
|
||
public static function reset(): void
|
||
{
|
||
self::$_entries = [];
|
||
}
|
||
}
|