phpday 2025 - Call For Papers

pg_get_notify

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

pg_get_notifyLiefert eine SQL-NOTIFY-Nachricht

Beschreibung

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

pg_get_notify() gibt eine NOTIFY-Nachricht zurück, die vom SQL-Kommando NOTIFY gesendet wurde. Um diese Nachrichten zu erhalten, muss zuvor das SQL-Kommando LISTEN ausgeführt worden sein.

Parameter-Liste

connection

Eine PgSql\Connection-Instanz.

mode

Ein optionaler Parameter, der bestimmt, wie das zurückgegebene Array indiziert werden soll. mode ist eine Konstante, die einen der folgenden Werte annehmen kann: PGSQL_ASSOC, PGSQL_NUM und PGSQL_BOTH. Wenn die Funktion mit PGSQL_NUM aufgerufen wird, wird ein Array mit numerischen Indizes zurückgegeben, mit PGSQL_ASSOC wird ein Array mit assoziatives Indizes zurückgegeben und mit PGSQL_BOTH ein Array mit beiden Indizes.

Rückgabewerte

Ein Array, das die NOTIFY-Nachricht und die PID des Datenbankprozesses enthält. Falls vom Server unterstützt, enthält das Array ebenfalls die Serverversion und die Nutzdaten. Existiert kein NOTIFY, wird false zurückgegeben.

Changelog

Version Beschreibung
8.1.0 Der Parameter connection erwartet nun eine PgSql\Connection-Instanz; vorher wurde eine Ressource erwartet.

Beispiele

Beispiel #1 PostgreSQL-NOTIFY-Nachricht

<?php
$conn
= pg_pconnect("dbname=publisher");
if (!
$conn) {
echo
"Konnte keine Verbindung aufbauen.\n";
exit;
}

// Listen-Kommando 'author_updated', um Benachrichtigungen
// von anderen Prozessen zu erhalten
pg_query($conn, 'LISTEN author_updated;');
$notify = pg_get_notify($conn);
if (!
$notify) {
echo
"Keine Nachrichten\n";
} else {
print_r($notify);
}
?>

Siehe auch

add a note

User Contributed Notes 2 notes

up
7
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