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

Применение pg_socket для доступа к соединению с PostgreSQL
Раздел: Базы данных (PostgreSQL)
pg_socket(PgSql\Connection $connection): resource|false
Описание функции pg_socket

Функция pg_socket возвращает ресурс сокета, используемый для низкоуровневой работы с подключением к базе данных PostgreSQL. Она применяется в ситуациях, требующих прямого управления сетевым соединением, например, для асинхронных операций, мониторинга или интеграции с event loop системами.

Аргументы функции

Функция принимает один обязательный параметр:

  • connection (ресурс) — ресурс подключения к базе данных PostgreSQL, полученный с помощью функций pg_connect() или pg_pconnect().

Возвращаемое значение: ресурс сокета или false в случае ошибки.

Базовые примеры использования
Получение сокета из подключения
$conn = pg_connect("host=localhost dbname=test user=postgres");
$socket = pg_socket($conn);

if ($socket === false) {
    echo 'Ошибка получения сокета.';
} else {
    echo 'Сокет успешно получен.';
    var_dump($socket);
}
Сокет успешно получен.
resource(5) of type (stream)
Проверка доступности подключения
$conn = pg_connect("host=localhost port=5432 dbname=test");
$socket = pg_socket($conn);

if ($socket && !feof($socket)) {
    echo 'Соединение активно.';
} else {
    echo 'Соединение закрыто или недоступно.';
}
Соединение активно.
Похожие функции в PHP

Для работы с PostgreSQL в PHP существует несколько альтернативных подходов:

  • pg_connect()/pg_pconnect() — стандартные функции установки подключения. Используются для большинства задач взаимодействия с базой данных.
  • PDO — универсальное расширение для работы с различными СУБД. Предоставляет переносимый API и подготовленные выражения.
  • Асинхронные библиотеки (например, Amp или ReactPHP) — предоставляют абстракции для асинхронной работы с сокетами и базами данных.

Функция pg_socket полезна в специфичных сценариях, когда требуется прямой доступ к сокету для нестандартных операций.

Аналоги в других языках
Python (psycopg2)
import psycopg2
conn = psycopg2.connect("dbname=test")
socket = conn.fileno()
print(socket)
5
JavaScript (Node.js с pg)
const { Client } = require('pg');
const client = new Client();
// Прямой доступ к сокету обычно не требуется,
// библиотека предоставляет асинхронный API.
await client.connect();

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

Типичные ошибки
Передача неверного ресурса
$socket = pg_socket('not_a_connection');
var_dump($socket);
Warning: pg_socket() expects parameter 1 to be resource, string given
bool(false)
Использование закрытого соединения
$conn = pg_connect("host=localhost");
pg_close($conn);
$socket = pg_socket($conn);
var_dump($socket);
Warning: pg_socket(): supplied resource is not a valid PostgreSQL connection resource
bool(false)

Для избежания ошибок стоит проверять тип ресурса перед вызовом функции.

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

В версии PHP 8.0.0 функция pg_socket стала возвращать ресурс типа resource|false. Ранее возвращался ресурс или null в случае неудачи.

Других значительных изменений в поведении функции в последних версиях не отмечено.

Расширенные примеры
Интеграция с stream_select для асинхронности
Пример php
$conn = pg_connect("host=localhost");
$socket = pg_socket($conn);

$read = [$socket];
$write = null;
$except = null;

if (stream_select($read, $write, $except, 1) > 0) {
    echo 'Сокет доступен для чтения.';
    // Здесь можно выполнить pg_get_result() или другую операцию
}

pg_close($conn);
Сокет доступен для чтения.
Мониторинг состояния соединения
Пример php
function is_connection_alive($connection) {
    $socket = pg_socket($connection);
    if (!$socket) return false;
    
    $read = [$socket];
    $write = [$socket];
    $except = [$socket];
    
    return stream_select($read, $write, $except, 0) !== false;
}

$conn = pg_connect("host=localhost");
echo is_connection_alive($conn) ? 'Активно' : 'Неактивно';
Активно
Использование с неблокирующими операциями
Пример php
$conn = pg_connect("host=localhost");
$socket = pg_socket($conn);

// Установка неблокирующего режима
stream_set_blocking($socket, false);

// Отправка простого запроса
pg_send_query($conn, "SELECT 1");

// Ожидание ответа с таймаутом
$read = [$socket];
if (stream_select($read, $write, $except, 5) > 0) {
    $result = pg_get_result($conn);
    echo 'Данные получены.';
}
Данные получены.

PHP pg_socket function comments

En
Pg socket Get a read only handle to the socket underlying a PostgreSQL connection