首页 > 解决方案 > 我正在尝试创建一个没有 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 秒内通知中。

标签: javascriptphpmysqljsonnotifications

解决方案


推荐阅读