首页 > 解决方案 > 服务器端事件 / EventSource / PostgreSQL 通知 - 仅当在数据库中进行事务时

问题描述

我试图让客户端(浏览器)知道数据库中何时有事务。
我在 JS 中使用 EventSource 与 PHP 连接,我在其中“收听”PostgreSQL DB。
发生的事情是 EventSource 每 3-4 秒侦听或读取数据,即使我没有设置任何内容。
我的意图是仅在数据库中有事务并且仅当数据库发出“通知”时才收到通知。

问题:EventSource 像轮询一样每 3-4 秒侦听一次,即使有来自 DB 的通知,它也会多次通知我。
关注:每次通过 PHP 运行时,我都会连接数据库,而这个 SSE 感觉就像轮询。

JavaScript

if(typeof(EventSource) !== "undefined") {
    var source = new EventSource("sse.php");
    source.onmessage = function(event) {
        console.log(event.data);
    };
} else {
    console.log("SSE NOT SUPPORTED");
}

PHP

header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');

$conn = pg_pconnect("DB INFO HERE") or die('DB CONNECT ERROR');
pg_query($conn, 'LISTEN event_insert;');
$notify = pg_get_notify($conn);

if (!$notify) {
    echo "data: .\n\n";
} else {
    $msg = json_encode($notify);
    echo "data: {$msg}\n\n";
}

flush();

PostgreSQL

CREATE OR REPLACE FUNCTION notify_event_insert() RETURNS trigger AS $$
DECLARE
BEGIN
  NOTIFY event_insert;
  RETURN new;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trigger_event_insert AFTER INSERT ON events
FOR EACH ROW EXECUTE PROCEDURE notify_event_insert();

JS 控制台

我得到'。当没有交易时,当有交易时我得到 JSON 并且数据库“通知”我。

截屏

标签: phppostgresqlnotifyeventsource

解决方案


轮询是记录要做的事情:

否则,如果没有 NOTIFY 正在等待,则返回 FALSE。

也许您想改用 PDO 的 pgsqlGetNotify。


推荐阅读