2024 年 PHP Conference Japan

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

一個可選參數,用於控制返回的 陣列 的索引方式。 mode 是一個常數,可以採用以下值:PGSQL_ASSOCPGSQL_NUMPGSQL_BOTH。使用 PGSQL_NUM,函式將返回一個具有數字索引的陣列;使用 PGSQL_ASSOC,它將僅返回關聯式索引;而 PGSQL_BOTH 將同時返回數字和關聯式索引。

傳回值

一個包含 NOTIFY 訊息名稱和後端 PID 的 陣列。如果伺服器支援,該陣列還會包含伺服器版本和有效負載。否則,如果沒有等待的 NOTIFY,則返回 false

更新日誌

版本 說明
8.1.0 connection 參數現在需要一個 PgSql\Connection 實例;以前需要的是一個 資源

範例

範例 #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);
}
?>

參見

新增筆記

使用者貢獻的筆記 2 則筆記

glococo at gmail dot com
7 年前
使用 HTML5 Server-Sent Events 的即時簡便 PHP 通知

sse.php
<?php
$dbconn
= new PDO("pgsql:host=localhost;dbname=mydb", "pduser", "userpass");
$dbconn->exec('LISTEN "channel_name"'); // 這些雙引號非常重要

header("X-Accel-Buffering: no"); // 禁用 ngnix 網頁伺服器緩衝
header("Content-Type: text/event-stream");
header("Cache-Control: no-cache");
ob_end_flush(); // 關閉 PHP 輸出緩衝
$inc=0;

while (
1) {
$result = "";
// 等待一個通知 10 秒,而不是使用 sleep(10)
$result = $dbconn->pgsqlGetNotify(PDO::FETCH_ASSOC, 10000);

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

flush();
}
?>

使用 Mozilla 網站的 HTML+JS 範例檔案 (ssedemo.php) 進行測試
david at frankieandshadow dot com
4 年前
pg_get_notify 似乎無法區分沒有訊息等待和檢查失敗的情況 - 兩者似乎都返回 FALSE。

我必須在 pg_get_notify 之前添加 pg_check_connection(...) 來檢查連線是否仍然有效(使用 pg_get_notify 時很可能是長期連線,因為您將輪詢等待某些事情發生)。在我的情況下,遠端資料庫伺服器發生了暫停,如果沒有 pg_check_connection,監聽器就沒有注意到,所以永遠不會看到後續的通知。
To Top