Пакет · cdo

Логирование и диагностика

CDO логирует каждый порождённый запрос через PSR-3 логгер и предоставляет лёгкие проверки здоровья у каждого конфига. Это руководство показывает, как подключить логгер, читать debug-вывод, зондировать доступность и восстанавливать устаревшее соединение.

Подключите PSR-3 логгер

Каждый конфиг стартует с NullLogger (молчит). Предоставьте свой логгер — и CDO запишет каждый построенный запрос на уровне debug.

Подключите его при первом создании конфига пулом:

php
use Flytachi\Winter\Cdo\ConnectionPool;
use App\Db\AppDb;

// $logger — любой Psr\Log\LoggerInterface
ConnectionPool::getConfigDb(AppDb::class, $logger);

$cdo = ConnectionPool::db(AppDb::class);

Или задайте его прямо на экземпляре конфига:

php
$config = ConnectionPool::getConfigDb(AppDb::class);
$config->setLogger($logger);

Подключайте логгер до соединения

Логгер передаётся CDO при открытии соединения. Задайте его до первого вызова connect() / db()ConnectionPool::getConfigDb() игнорирует аргумент $logger при каждом вызове после того, как конфиг закеширован.

Что логируется

Каждый метод DML логирует порождённый SQL на уровне debug с префиксом операции:

Префикс Метод
insert: insert()
insert group: insertGroup() (на каждый чанк)
upsert: upsert()
insert or update group: upsertGroup() (на каждый чанк)
update: update()
delete: delete()

Логируемая строка — это запрос с его :плейсхолдерами, а не привязанные значения, поэтому debug-логи никогда не утекают сами данные.

Проверки здоровья

Каждый конфиг предлагает два зонда, оба выполняют SELECT 1:

php
$config = ConnectionPool::getConfigDb(AppDb::class);

$config->ping();        // bool — доступна?

$config->pingDetail();  // ['status' => bool, 'latency' => float|null (мс), 'error' => string|null]

Используйте ping() для проверки готовности и pingDetail(), когда нужна задержка или сообщение об ошибке для эндпоинта статуса.

Восстановление устаревшего соединения

Соединения могут устаревать после долгого простоя или тайм-аута на стороне сервера. Конфиг предоставляет полный жизненный цикл:

php
$config = ConnectionPool::getConfigDb(AppDb::class);

$config->disconnect(); // освободить ссылку на CDO
$config->connect();    // лениво переоткрыть
$config->reconnect();  // disconnect + connect одним вызовом

Частый приём — повторить один раз при сбое:

php
use Flytachi\Winter\Cdo\Connection\CDOException;

try {
  $id = ConnectionPool::db(AppDb::class)->insert('events', $event);
} catch (CDOException $e) {
  ConnectionPool::getConfigDb(AppDb::class)->reconnect();
  $id = ConnectionPool::db(AppDb::class)->insert('events', $event);
}

Связанное