PHP Conference Japan 2024

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() 获取由 NOTIFY SQL 命令生成的通知。要接收通知,必须发出 LISTEN SQL 命令。

参数

connection

一个 PgSql\Connection 实例。

mode

一个可选参数,控制返回的 array 如何索引。mode 是一个常量,可以取以下值:PGSQL_ASSOCPGSQL_NUMPGSQL_BOTH。使用 PGSQL_NUM,函数将返回一个带有数字索引的数组,使用 PGSQL_ASSOC 它将只返回关联索引,而 PGSQL_BOTH 将返回数字和关联索引。

返回值

一个包含 NOTIFY 消息名称和后端 PID 的 array。如果服务器支持,该数组还包含服务器版本和有效负载。否则,如果没有 NOTIFY 正在等待,则返回 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);
}
?>

参见

添加注释

用户贡献的注释 2 条注释

glococo at gmail dot com
7 年前
使用 HTML5 服务器发送事件的即时且简单的 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 webServer 缓冲
header("Content-Type: text/event-stream");
header("Cache-Control: no-cache");
ob_end_flush(); // 关闭 PHP 输出缓冲
$inc=0;

while (
1) {
$result = "";
// 等待一个 Notify 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