Pg socket: примеры (PHP)
pg_socket(PgSql\Connection $connection): resource|falseФункция 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 'Соединение закрыто или недоступно.';
}Соединение активно.
Для работы с PostgreSQL в PHP существует несколько альтернативных подходов:
- pg_connect()/pg_pconnect() — стандартные функции установки подключения. Используются для большинства задач взаимодействия с базой данных.
- PDO — универсальное расширение для работы с различными СУБД. Предоставляет переносимый API и подготовленные выражения.
- Асинхронные библиотеки (например, Amp или ReactPHP) — предоставляют абстракции для асинхронной работы с сокетами и базами данных.
Функция pg_socket полезна в специфичных сценариях, когда требуется прямой доступ к сокету для нестандартных операций.
import psycopg2
conn = psycopg2.connect("dbname=test")
socket = conn.fileno()
print(socket)5
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 8.0.0 функция pg_socket стала возвращать ресурс типа resource|false. Ранее возвращался ресурс или null в случае неудачи.
Других значительных изменений в поведении функции в последних версиях не отмечено.
$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);Сокет доступен для чтения.
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) ? 'Активно' : 'Неактивно';Активно
$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 'Данные получены.';
}Данные получены.