Pg untrace: примеры (PHP)

Руководство по pg_untrace для отладки соединений с PostgreSQL
Раздел: Базы данных (PostgreSQL)
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 ? 'Успешно' : 'Ошибка';
?>
Успешно
Похожие функции в PHP

Прямых аналогов pg_untrace() в PHP нет, так как она служит для управления конкретным механизмом отладки модуля PostgreSQL. Связанная функция:

  • pg_trace() — инициирует начало трассировки соединения с PostgreSQL в файл или поток. Используется всегда в паре с pg_untrace().

Для общей отладки SQL-запросов часто предпочтительнее использовать логирование на уровне приложения (например, с помощью PDO атрибута PDO::ATTR_ERRMODE и пользовательских логгеров) или средства самой СУБД PostgreSQL (например, параметр конфигурации log_statement). Эти подходы предоставляют более структурированную и безопасную для производства информацию.

Альтернативы в других языках и системах
Python (библиотека psycopg2)

Прямого аналога нет. Трассировка соединения обычно настраивается через системные библиотеки или внешние профилировщики.

JavaScript (библиотека node-postgres)

Аналога не существует. Отладка выполняется через логирование запросов на уровне драйвера или приложения.

Pg untrace в MySQL

В MySQL существует команда SET для управления общим логом запросов, но она не привязана к конкретному соединению на стороне клиента, как pg_trace/pg_untrace.

-- Включение общего лога (на сервере, для всех клиентов)
SET GLOBAL general_log = 'ON';
-- Выключение
SET GLOBAL general_log = 'OFF';

Таким образом, подход в PHP с pg_trace/pg_untrace является более низкоуровневым и изолированным для конкретного соединения.

Типичные ошибки
Вызов 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()

Если скрипт завершится аварийно или вызов pg_untrace() не произойдет, файл трассировки может остаться открытым, хотя система обычно закрывает его. Лучше использовать конструкции try...finally для гарантированного отключения.

Изменения в версиях PHP

Для функции pg_untrace() в последних основных версиях PHP (8.x) значимых изменений в сигнатуре или поведении не зафиксировано. Стоит отметить, что в PHP 8.0 тип параметра $connection был ужесточен: теперь ожидается ресурс (PgSql\Connection в виде объекта в PHP 8.1+), а не resource. Это повышает надежность типа.

Расширенные примеры
Гарантированное отключение трассировки с использованием try...finally
Пример php
<?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";
    }
}
?>
Трассировка завершена, даже при ошибке.
Трассировка с выводом в поток stderr
Пример php
<?php
$conn = pg_connect("...");
// В Unix-системах можно использовать поток stderr
if (pg_trace('php://stderr', 'w', $conn)) {
    pg_query($conn, "SELECT version()"); // Запросы будут видны в логах веб-сервера/консоли
    pg_untrace($conn);
}
?>
Проверка содержимого файла трассировки после выполнения
Пример php
<?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 ... (данные в бинарном формате, могут выглядеть как "мусор")

Трассировка показывает сырой протокольный обмен, который полезен для глубокой отладки проблем с кодировкой, сжатием или самим протоколом.

PHP pg_untrace function comments

En
Pg untrace Disable tracing of a PostgreSQL connection