Php 服务器端事件/EventSource/PostgreSQL Notify-仅当事务在数据库中时

Php 服务器端事件/EventSource/PostgreSQL Notify-仅当事务在数据库中时,php,postgresql,notify,eventsource,Php,Postgresql,Notify,Eventsource,我试图让客户端(浏览器)知道数据库中何时有事务。 我正在使用JS中的EventSource与PHP连接,在这里我“监听”PostgreSQL DB。 发生的情况是,EventSource每3-4秒侦听或读取一次数据,即使我没有对此进行任何设置。 我的目的是仅当DB中存在事务时,以及仅当DB发出“通知”时,才获得通知 问题:EventSource像轮询一样每3-4秒侦听一次,它会多次通知我,即使有一个来自DB的通知。 关注点:每次DB通过PHP运行时,我都会连接它,这个SSE感觉像是轮询 Java

我试图让客户端(浏览器)知道数据库中何时有事务。
我正在使用JS中的EventSource与PHP连接,在这里我“监听”PostgreSQL DB。
发生的情况是,EventSource每3-4秒侦听或读取一次数据,即使我没有对此进行任何设置。
我的目的是仅当DB中存在事务时,以及仅当DB发出“通知”时,才获得通知

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

JavaScript PHP PostgreSQL JS控制台 当没有事务时,我得到“.”,当有事务时,我得到JSON,DB“通知”我

轮询就是这样做的:

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

也许您想改用PDO的pgsqlGetNotify。

轮询就是要做的:

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


也许你想改用PDO的pgsqlGetNotify。

我不太明白。那么,你的意思是,为了保持监听,必须在无限循环中监听NOTIFY?我不希望这是投票。我不想把它放在一个永远为真的while循环中,就像最下面的最后一个例子一样。pg_get_notify将轮询,如果没有挂起任何内容,则立即返回false。pgsqlGetNotify将一直阻塞,直到它收到消息为止(如果使用超时,则会超时)。如果要在第一条消息/非消息之后继续侦听,则必须循环。还有别的选择吗?好的。所以,pg_get_notify是轮询。很高兴知道。我正在寻找方法的事件处理程序类型。对我来说,pgsqlgetnotify似乎就是我想要的。如果不循环它,当有新事务(DB Notify)时,我仍然可以得到接近实时的通知吗?我想在DB通知时得到通知,但我不想轮询。我不太明白。那么,你的意思是,为了保持监听,必须在无限循环中监听NOTIFY?我不希望这是投票。我不想把它放在一个永远为真的while循环中,就像最下面的最后一个例子一样。pg_get_notify将轮询,如果没有挂起任何内容,则立即返回false。pgsqlGetNotify将一直阻塞,直到它收到消息为止(如果使用超时,则会超时)。如果要在第一条消息/非消息之后继续侦听,则必须循环。还有别的选择吗?好的。所以,pg_get_notify是轮询。很高兴知道。我正在寻找方法的事件处理程序类型。对我来说,pgsqlgetnotify似乎就是我想要的。如果不循环它,当有新事务(DB Notify)时,我仍然可以得到接近实时的通知吗?我希望在DB通知时得到通知,但我不希望轮询。
if(typeof(EventSource) !== "undefined") {
    var source = new EventSource("sse.php");
    source.onmessage = function(event) {
        console.log(event.data);
    };
} else {
    console.log("SSE NOT SUPPORTED");
}
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();
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();