服务器端事件/ EventSource / PostgreSQL通知-仅在数据库中进行事务处理时

问题描述

我正在尝试让客户端(浏览器)知道数据库中是否存在事务。
我在JS中使用EventSource与PHP连接,在这里我“监听”了PostgreSQL DB。
发生的是,即使我没有设置任何事件源,EventSource也会每3-4秒侦听或读取一次数据。
我的意图是仅在数据库中有事务时通知,并且仅当DB发出“通知”时得到通知。

问题:EventSource每隔3-4秒就进行一次监听,就像轮询一样,即使来自数据库的一条通知也可以多次通知我。
CONCERN :每次通过PHP运行DB时,我都在连接数据库,而此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。

Screenshot

解决方法

进行投票documented是什么:

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

也许您想使用PDO的pgsqlGetNotify。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...