PHP 8.4.2 Released!

pg_get_notify

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

pg_get_notifyПолучение SQL NOTIFY сообщения

Описание

pg_get_notify(PgSql\Connection $connection, int $mode = PGSQL_ASSOC): array|false

pg_get_notify() получает уведомления, сгенерированные командой SQL NOTIFY. Для получения уведомлений используйте команду SQL LISTEN.

Список параметров

connection

Экземпляр класса PgSql\Connection.

mode

Необязательный параметр, который управляет индексированием массив (array), который возвращает функция. Параметр mode — константа и принимает следующие значения: PGSQL_ASSOC, PGSQL_NUM и PGSQL_BOTH. С константой PGSQL_NUM функция возвращает массив с числовыми индексами, с константой PGSQL_ASSOC функция вернёт только ассоциативные индексы, а с PGSQL_BOTH — вернёт как числовые, так и ассоциативные индексы.

Возвращаемые значения

Массив (array), содержащий сообщение NOTIFY и PID сервера БД. Если поддерживается сервером, массив также содержит версию сервера и полезную нагрузку. Если никаких уведомлений не ожидается, функция вернёт false.

Список изменений

Версия Описание
8.1.0 Параметр connection теперь ожидает экземпляр класса PgSql\Connection; раньше параметр ожидал ресурс (resource).

Примеры

Пример #1 Сообщение PostgreSQL NOTIFY

<?php
$conn
= pg_pconnect("dbname=publisher");
if (!
$conn) {
echo
"Произошла ошибка.\n";
exit;
}

// Слушаем сообщение 'author_updated' из другого процесса
pg_query($conn, 'LISTEN author_updated;');
$notify = pg_get_notify($conn);
if (!
$notify) {
echo
"Нет сообщений\n";
} else {
print_r($notify);
}
?>

Смотрите также

  • pg_get_pid() - Получает ID процесса сервера БД

Добавить

Примечания пользователей 2 notes

up
5
glococo at gmail dot com
7 years ago
Instant yet Simple PHP notification with HTML5 Server-Sent Events

sse.php
<?php
$dbconn
= new PDO("pgsql:host=localhost;dbname=mydb", "pduser", "userpass");
$dbconn->exec('LISTEN "channel_name"'); // those doublequotes are very important

header("X-Accel-Buffering: no"); // disable ngnix webServer buffering
header("Content-Type: text/event-stream");
header("Cache-Control: no-cache");
ob_end_flush(); // close PHP output buffering
$inc=0;

while (
1) {
$result = "";
// wait for one Notify 10seconds instead of using sleep(10)
$result = $dbconn->pgsqlGetNotify(PDO::FETCH_ASSOC, 10000);

if (
$result ) {
echo
"id: $inc\ndata: ".stripslashes(json_encode($result))."\n\n";
$inc++;
}

flush();
}
?>

Tested with HTML+JS sample file from Mozilla web site (ssedemo.php)
up
0
david at frankieandshadow dot com
4 years ago
It appears that pg_get_notify does not distinguish between no message waiting and a failure when checking - both seem to return FALSE.

I had to add a pg_check_connection(...) before pg_get_notify to check the connection is still alive (it's quite likely to be a long-standing connection with pg_get_notify as you'll be polling waiting for something to happen). In my case the remote database server had a hiccup, and without pg_check_connection the listeners failed to notice, so never saw later notifications.
To Top