javascript - 我正在尝试创建一个没有 websockets 和轮询的通知系统 - 只是简单的 JSON?
问题描述
我正在尝试在不使用 Websockets 或 Polling 的情况下以最有效、最快的方式构建一个实时通知系统,没有滞后,并且成本最低 UX。
这是我到目前为止起草的想法:
1- 每次用户 (A) 收到另一个用户 (B) 的消息时,我使用 PHP 在用户 A 和 B 之间传递消息,并使用 MySQL 存储带有时间戳的事务。
2-我每 60 秒运行一次 Cronjob 以将 MySQL 数据解析为 JSON 格式,并更新一个名为的文件,该文件data.JSON
存储我网站上所有用户之间的所有消息(@stackoverflow 安全人员,不会有任何敏感数据或如果你要为此逮捕我,通知中的个人信息!)。这意味着文件每 60 秒更新一次,无论是否有新数据要获取。这是 JSON 格式的输出示例:
[
{
"notification": {
"user_ref": "00007939786",
"sender": "12089301923",
"message": "Message 1",
"created_at": "2019-02-11 14:47:11"
}
},
{
"notification": {
"user_ref": "00007939786",
"sender": "78921739812",
"message": "Message 2",
"created_at": "2019-02-11 14:46:11"
}
},
{
"notification": {
"user_ref": "00007939787",
"sender": "91290381920",
"message": "Message 3",
"created_at": "2019-02-11 14:34:11"
}
},
...
3- 网页(例如 index.html)还有一个 JavaScript setInterval 函数,它每 60 秒检查一次 JSON 文件中的更改(与 Cronjob 相同的秒数)。这是用于读取 JSON 文件的 jQuery 代码的外观:https ://codepen.io/mslilafowler/pen/xMjZmo?editors=0012
总而言之,该功能正在尝试检查文件是否已更改,如果文件已更改,则检查当前用户是否有任何通知,如果有,则检查它们是否是新的(即在过去 60 秒内) , 保持一致)。如果满足所有这些条件,则计算新通知的数量,然后打印出新消息(出于测试目的,一切都在控制台中完成)。
我在理论上已经完成了所有这些,并且之前曾将 MySQL 数据解析为 JSON 格式,所以这很好,但是我面临着几个问题:
a) 这不能按原样实时工作。我搜索了整个网络关于同步 MySQL 和 JavaScript date-times-minus-60-seconds,但我终于到了倦怠阶段,因为
b) PHP 是异步的,尝试混合使用 Ajax 和 setInterval 来获取实际的当前实时时间,而无需刷新页面。这导致我的代码中断,因为它正在检查过去 60 秒内是否有新通知,并且如果用户没有刷新浏览器很多分钟,那么当前 PHP 时间与页面启动后相同,然后代码会将旧通知反映为“新”。
c) JavaScript 的日期时间与 MySQL 的不同,我需要使用一个替代库,如提及.js 只是为了比较它而不破坏时区
d) 所有这些都需要在不刷新页面的情况下完成
e) 我研究了 Websockets、轮询和长轮询,但如果这可以单独使用 javascript/JSON、PHP 和 MySQL 完成,我会更喜欢。
所以我几乎可以创建一个通知系统,除了时间的混淆。
首先,每种语言都有自己的时间格式和时区,其次,更准确的语言是异步的,这意味着虽然 PHP 更准确,但如果不每隔 1 秒刷新一次页面,我就无法获得当前的 PHP 时间。
我觉得唯一真正的解决方案是从 JavaScript setInterval 函数中的 Ajax 调用获取返回的结果,例如 setInterval(function(){ajax-get-PHP-current-time}, 1000),但我的尝试失败了.
这个问题不需要自以为是的答案,我只需要这个方法是否可以的建议,以及关于如何在不刷新页面的情况下实时同步 MySQL 数据、PHP 和 JavaScript 之间的时间的建议,以便旧的通知不会'不要添加到新的 60 秒内通知中。
解决方案
推荐阅读
- flutter - 如何在颤动中将周,月,年添加到日期
- jakarta-mail - 内容 ID 为空的电子邮件
- node.js - 将在nodejs中创建的exceljs工作簿数据保存到客户端(已解决)
- jquery - 如何将光滑的滑块全宽居中?
- nginx - Ansible:如果语法正常,重新加载 nginx 的快速方法?
- javascript - 单击 div 发出声音,并且同一个 div 链接到键盘声音...有可能吗?
- android - 如何在起点和终点之间绘制多条路线,googlemaps api?
- asp.net - 为集成测试隔离数据库操作
- python - 添加计数图总数并删除特定标签
- javascript - 是否必须通过 props 来响应功能组件?