我正在尝试以最有效,最快的方式,没有滞后,并且花费最少的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秒内的新通知中。