问题描述
我正在尝试让客户端(浏览器)知道数据库中是否存在事务。
我在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。