php - 服务器端事件 / 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 并且数据库“通知”我。
解决方案
推荐阅读
- java - java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“java.util.Iterator java.util.ArrayList.iterator()”
- java - 您将如何为构造函数创建测试?
- python - 如何在不使用 for 循环的情况下仅更新二维列表中的选定值?
- python - 保持具有相同结果的行或应该有一些熊猫的行
- javascript - 如何使用firebase auth在nodejs的服务器端验证用户电话号码
- android - 如何使用 Kotlin 从 EditText 获取 LiveData 值并在 TextView 中显示?MVVM
- vue.js - 不支持的 URL 类型“npm:”:npm:vue-loader@^16.0.0-beta.3
- angular - 角度路由中的 CanActivate 保护,无需重复“CanActivate”属性
- python - 为什么不把转换后的文件放到桌面?
- java - TextSecure 信号服务器 - 证书错误