我正在尝试创建一个没有websocket和轮询的通知系统-只是简单的JSON?

时间:2019-02-11 14:25:22

标签: javascript php mysql json notifications

我正在尝试以最有效,最快的方式,没有滞后,并且花费最少的UX来构建不使用Websocket或轮询的实时通知系统。

这是我到目前为止起草的想法:

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秒(与Cronjob相同的秒数)检查一次JSON文件中的更改。读取JSON文件的jQuery代码如下:https://codepen.io/mslilafowler/pen/xMjZmo?editors=0012

总而言之,该功能正在尝试检查文件是否已更改,如果文件已更改,请检查当前用户是否有任何通知,如果有,请检查它们是否为新通知(即, 60秒以内)。如果满足所有这些条件,则计算新通知的数量,然后打印出新消息(出于测试目的,所有操作均在控制台中完成)。

从理论上讲,我已经完成了所有这些工作,并且之前曾将MySQL数据解析为JSON格式,所以这很好,但是我遇到了两个问题:

a)这不能实时工作。我在整个Web上搜索了有关同步MySQL和JavaScript datetimes-minus-60-seconds的信息,但是最终我进入了倦怠阶段,因为

b)PHP是异步的,尝试使用Ajax和setInterval的混合物来获取实际的当前实时信息,而无需刷新页面。这导致我的代码中断,因为它正在检查最近60秒钟内是否有新的通知,并且如果用户在几分钟内没有刷新浏览器,那么自页面启动以来,当前的PHP时间是相同的,然后代码会将旧的通知反映为“新”。

c)JavaScript的日期时间与MySQL的日期时间非常不同,以至于我需要使用替代类库(如提及.js)来比较它,而不会破坏时区

d)所有这些都需要在不刷新页面的情况下完成

e)我研究了Websockets,Polling和Long Polling,但如果可以单独使用javascript / JSON,PHP和MySQL来完成此操作,我会更愿意。

因此,除了时间混乱之外,我几乎可以创建通知系统。

首先,每种语言都有其自己的时间格式和时区,其次,更精确的语言是异步的,这意味着尽管PHP更准确,但是如果不刷新每个页面,我将无法获得当前的PHP时间。 1秒。

我觉得唯一真正的解决方案是从JavaScript setInterval函数内部的Ajax调用中获取返回结果,类似于setInterval(function(){ajax-get-PHP-current-time},1000),但是我尝试失败了。

这个问题不需要确定的答案,我只需要有关此方法是否可行的建议,以及有关如何在不刷新页面的情况下实时同步MySQL数据,PHP和JavaScript之间的时间的建议,以便旧通知不会添加到60秒内的新通知中。

0 个答案:

没有答案