首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >服务器端事件/ EventSource / PostgreSQL只在DB事务处理时通知

服务器端事件/ EventSource / PostgreSQL只在DB事务处理时通知
EN

Stack Overflow用户
提问于 2020-09-23 08:52:02
回答 1查看 515关注 0票数 1

当数据库中有事务时,我试图让客户端(浏览器)知道。

我在JS中使用EventSource与PostgreSQL连接,在那里我“监听”PostgreSQL DB。

所发生的是,EventSource每3-4秒监听或读取数据,即使我没有设置任何有关它的内容。

我的意图是,只有在DB 中有事务时,并且只有DB发出“通知”时,才会通知

PROBLEM:EventSource每3-4秒监听一次,就像轮询一样,它会多次通知我,即使有一次来自DB的通知。

关注点:每当DB通过运行时,我都会连接它,这个SSE感觉就像是轮询。

JavaScript

代码语言: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

代码语言:javascript
复制
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

代码语言:javascript
复制
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,而DB‘通知’me。

EN

回答 1

Stack Overflow用户

发布于 2020-09-23 16:23:31

轮询是记录在案应该做的事情:

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

也许你想用PDO的pgsqlGetNotify代替。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64024309

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档