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)pg_get_notify
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
pg_get_notify
Референца за `function.pg-get-notify.php` со подобрена типографија и навигација.
pg_get_notify
(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)
pg_get_notify — Добива SQL NOTIFY порака
= NULL
pg_get_notify() добива известувања генерирани од
NOTIFY SQL команда. За да примите известувања, LISTEN SQL командата мора да биде издадена.
Параметри
connection-
Еден PgSql\Connection instance.
mode-
Опционален параметар што контролира како вратениот array е индексиран.
modeе константа и може да ги земе следните вредности:PGSQL_ASSOC,PGSQL_NUMandPGSQL_BOTH. КористејќиPGSQL_NUM, функцијата ќе врати низ со нумерички индекси, користејќиPGSQL_ASSOCќе врати само асоцијативни индекси додекаPGSQL_BOTHќе врати и нумерички и асоцијативни индекси.
Вратени вредности
Еден array што го содржи NOTIFY име на пораката и PID на бекендот. Ако е поддржано од серверот, низата исто така ги содржи верзијата на серверот и товарот. Во спротивно, ако нема NOTIFY чека, тогаш false се враќа.
Дневник на промени
| Верзија | = NULL |
|---|---|
| 8.1.0 |
На connection параметарот очекува PgSql\Connection
инстанца сега; претходно, а resource се очекуваше.
|
Примери
Пример #1 PostgreSQL NOTIFY порака
<?php
$conn = pg_pconnect("dbname=publisher");
if (!$conn) {
echo "An error occurred.\n";
exit;
}
// Listen 'author_updated' message from other processes
pg_query($conn, 'LISTEN author_updated;');
$notify = pg_get_notify($conn);
if (!$notify) {
echo "No messages\n";
} else {
print_r($notify);
}
?>Белешки од корисници 2 забелешки
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.