Pg untrace: примеры (PHP)
pg_untrace(?PgSql\Connection $connection = null): boolФункция pg_untrace() в PHP прекращает трассировку соединения с базой данных PostgreSQL, которая была активирована ранее с помощью функции pg_trace(). Её использование целесообразно для отладки взаимодействия с СУБД, когда требуется проанализировать низкоуровневый обмен данными между клиентом и сервером. После вызова pg_untrace() запись отправляемых и получаемых данных в указанный файл или поток прекращается.
$connection(необязательный) — ресурс подключения к PostgreSQL. Если параметр не указан, используется последнее открытое по умолчанию соединение.
Функция возвращает логическое значение: true при успешном завершении или false в случае неудачи.
<?php
$conn = pg_connect("host=localhost dbname=test user=postgres");
// Включаем трассировку в файл trace.log
$traceResult = pg_trace('trace.log', 'w', $conn);
if ($traceResult) {
echo "Трассировка начата.\n";
// Выполнение запроса...
$res = pg_query($conn, "SELECT 1");
// Останавливаем трассировку
$untraceResult = pg_untrace($conn);
if ($untraceResult) {
echo "Трассировка остановлена.\n";
}
}
?>
Трассировка начата. Трассировка остановлена.
<?php
// Предполагается, что есть активное соединение по умолчанию
$traceResult = pg_trace('trace.log');
// ... выполняются операции с БД ...
$untraceResult = pg_untrace(); // Остановка трассировки для соединения по умолчанию
echo $untraceResult ? 'Успешно' : 'Ошибка';
?>
Успешно
Прямых аналогов pg_untrace() в PHP нет, так как она служит для управления конкретным механизмом отладки модуля PostgreSQL. Связанная функция:
pg_trace()— инициирует начало трассировки соединения с PostgreSQL в файл или поток. Используется всегда в паре сpg_untrace().
Для общей отладки SQL-запросов часто предпочтительнее использовать логирование на уровне приложения (например, с помощью PDO атрибута PDO::ATTR_ERRMODE и пользовательских логгеров) или средства самой СУБД PostgreSQL (например, параметр конфигурации log_statement). Эти подходы предоставляют более структурированную и безопасную для производства информацию.
Прямого аналога нет. Трассировка соединения обычно настраивается через системные библиотеки или внешние профилировщики.
Аналога не существует. Отладка выполняется через логирование запросов на уровне драйвера или приложения.
Pg untrace в MySQL
В MySQL существует команда SET для управления общим логом запросов, но она не привязана к конкретному соединению на стороне клиента, как pg_trace/pg_untrace.
-- Включение общего лога (на сервере, для всех клиентов)
SET GLOBAL general_log = 'ON';
-- Выключение
SET GLOBAL general_log = 'OFF';
Таким образом, подход в PHP с pg_trace/pg_untrace является более низкоуровневым и изолированным для конкретного соединения.
Функция вернет false, если трассировка для указанного соединения не была начата.
<?php
$conn = pg_connect("...");
$result = pg_untrace($conn); // Трассировка не включалась
var_dump($result);
?>
bool(false)
<?php
$fakeConn = null;
$result = pg_untrace($fakeConn);
var_dump($result);
?>
Warning: pg_untrace() expects parameter 1 to be resource, null given bool(false)
Если скрипт завершится аварийно или вызов pg_untrace() не произойдет, файл трассировки может остаться открытым, хотя система обычно закрывает его. Лучше использовать конструкции try...finally для гарантированного отключения.
Для функции pg_untrace() в последних основных версиях PHP (8.x) значимых изменений в сигнатуре или поведении не зафиксировано. Стоит отметить, что в PHP 8.0 тип параметра $connection был ужесточен: теперь ожидается ресурс (PgSql\Connection в виде объекта в PHP 8.1+), а не resource. Это повышает надежность типа.
<?php
$conn = pg_connect("...");
$traceFile = 'debug_trace.log';
$traceStarted = false;
try {
if (pg_trace($traceFile, 'w', $conn)) {
$traceStarted = true;
// Выполнение критических или сложных запросов
pg_query($conn, "BEGIN");
// ... операции с данными ...
pg_query($conn, "COMMIT");
}
} catch (Exception $e) {
// Обработка ошибок
echo "Ошибка: " . $e->getMessage();
} finally {
// Всегда останавливаем трассировку, если она была запущена
if ($traceStarted) {
pg_untrace($conn);
echo "Трассировка завершена, даже при ошибке.\n";
}
}
?>
Трассировка завершена, даже при ошибке.
<?php
$conn = pg_connect("...");
// В Unix-системах можно использовать поток stderr
if (pg_trace('php://stderr', 'w', $conn)) {
pg_query($conn, "SELECT version()"); // Запросы будут видны в логах веб-сервера/консоли
pg_untrace($conn);
}
?>
<?php
$conn = pg_connect("host=localhost port=5432 dbname=test");
$traceFile = 'last_trace.log';
@unlink($traceFile); // Удаляем старый файл
pg_trace($traceFile, 'w', $conn);
$result = pg_query($conn, "SELECT current_user");
pg_untrace($conn);
if (file_exists($traceFile)) {
echo "Содержимое лога трассировки:\n\n";
echo htmlspecialchars(file_get_contents($traceFile));
}
?>
Содержимое лога трассировки: > SELECT current_user < T ... (данные в бинарном формате, могут выглядеть как "мусор")
Трассировка показывает сырой протокольный обмен, который полезен для глубокой отладки проблем с кодировкой, сжатием или самим протоколом.