PHP 8.1.0 RC 4 available for testing

pg_get_notify

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

pg_get_notify Lit le message SQL NOTIFY

Description

pg_get_notify(resource $connection, int $mode = PGSQL_ASSOC): array|false

pg_get_notify() reçoit le message de NOTIFY envoyé par une commande SQL NOTIFY. Pour lire le message associé, utilisez la commande LISTEN.

Liste de paramètres

connection

Une ressource de connexion de base de donnée PostgreSQL.

mode

Un paramètre optionnel qui contrôle la façon dont le tableau sera indexé. mode est une constante et peut prendre les valeurs suivantes : PGSQL_ASSOC, PGSQL_NUM et PGSQL_BOTH. L'utilisation de PGSQL_NUM, pg_get_notify() retournera un tableau avec des indices numériques, l'utilisation de PGSQL_ASSOC retournera un tableau associatif tandis que PGSQL_BOTH, la valeur par défaut, retournera des indices numériques et associatifs.

Valeurs de retour

Un tableau contenant le nom du message NOTIFY. Si le serveur supporte, le tableau contient aussi la version du serveur et la charge utile (payload). Sinon, si aucun NOTIFY n'est en attente, alors false sera retourné.

Exemples

Exemple #1 Exemple avec pg_get_notify()

<?php 
$conn 
pg_pconnect("dbname=publisher");
if (!
$conn) {
  echo 
"Une erreur est survenue.\n";
  exit;
}

// ecoute le message 'author_updated' des autres processus
pg_query($conn'LISTEN author_updated;');
$notify pg_get_notify($conn);
if (!
$notify) {
  echo 
"Aucun message\n";
} else {
  
print_r($notify);
}
?>

Voir aussi

  • pg_get_pid() - Lit l'identifiant de processus du serveur PostgreSQL

add a note add a note

User Contributed Notes 2 notes

up
5
glococo at gmail dot com
4 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
11 months 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