不使用数据库和文件作为存储,如何实现PHP网站访客之间的聊天?

2023-06-28 奥古斯宏

如果作为一道应用题,这题没什么意义,因为任何应用涉及到数据存储,最基本的方案就是用数据库,对于博客网站也可能采用文件存储,其他的更高级的方案基本都是这种方案的演变。

但如果作为一个脑洞题,还是比较有意思的。

假设我们要用PHP来实现一个网站,除了基本的页面浏览,还要实现用户之间实时聊天,那么技术栈很明确了,除了一般的技术要求,还需要websocket这种东西,而PHP实现websocket服务有很多方法,比如:workerman、swoole等等。(但本文不去讨论太多的技术实现,讨论一下方案的设计思路)。

当我们实现了websocket服务之后,对于长连接传输的数据(聊天数据),如何在不使用数据库的情况下存储呢?答案是:“不存储”,不存储自然就不需要数据库了。

但是不存储,难道用户每次刷新就会丢失历史记录吗?

并不是,这里我们只是不让“服务端”去存储,让客户端自己想办法存储,比如在浏览器中,把数据存到localStorage中,甚至可以把聊天记录导出为某个格式,比如:“JSON”。

即在我们设计的这套可以聊天的PHP系统中,PHP提供的是一个开放的标准的聊天规则,至于具体的数据存储,由客户端自行解决。

版权声明:本文由phpreturn.com(PHP武器库官网)原创和首发,所有权利归phpreturn(PHP武器库)所有,本站允许任何形式的转载/引用文章,但必须同时注明出处。

他可以把json另存为一个文件,也可以发送到微信的“文件传输助手里”,也可以背下来,每次导入的时候一点一点输入。

但是这样做会有很多的问题需要解决,比如聊天记录的可靠性,如果有人把JSON导出之后,修改了一些内容,再导入到系统中,聊天用户双方如何去甄别这个事呢?

我们可以这样设计,导出的JSON中,不仅有自己的聊天数据,也有对方的聊天数据,并且每个数据都有至少有这四个属性:内容、时间戳、MD5签名、UUID。这里的MD5签名即内容+时间戳的签名。当双方加入到聊天室时,要把本地的聊天记录都交换并渲染到页面上。其中对于双方都一致的数据正常显示,对于不一致的,可以在这条数据旁边加上一个叹号,并标注具体的原因,比如:

  • 该记录本地无存储(由对方伪造的或者该记录在本地被删除了)
  • 该记录被篡改(双方的UUID一致,但是签名不一致)

等等各种情况。

这样的话,虽然要处理很多的边界情况,但是“服务端”不需要处理数据,只是提供一个长连接推送能力就行了。而处理的这些边界情况,大多数是因为“服务端不愿意存储数据”造成的。

然而无论怎样去设计这样一个系统,聊天双方还是需要依赖服务端去实现一些功能,比如:身份验证。否则用户双方就很难识别对方的身份是不是伪造的了,总不能聊天之前互相验证一下预留的暗号吧。

版权声明:本文由phpreturn.com(PHP武器库官网)原创和首发,所有权利归phpreturn(PHP武器库)所有,本站允许任何形式的转载/引用文章,但必须同时注明出处。

“地瓜地瓜,我是土豆,我是土豆,听到请回答。”

“对不起,你的接头暗号错了,对方拒绝和你聊天。”

最近浏览
IP用户:182.201.*.*
3 小时前 Go-http-client
IP用户:52.25.*.*
4 小时前 Generic Bot
IP用户:157.55.*.*
1 天前 BingBot
IP用户:54.201.*.*
1 天前 Nutch-based Bot
IP用户:101.67.*.*
1 天前 Generic Bot
IP用户:123.244.*.*
2 天前 Go-http-client
IP用户:52.13.*.*
2 天前 Nutch-based Bot
IP用户:112.13.*.*
2 天前 Generic Bot
IP用户:120.227.*.*
2 天前 Go-http-client
IP用户:116.179.*.*
2 天前 Baidu Spider
IP用户:116.179.*.*
2 天前 Baidu Spider
IP用户:220.181.*.*
3 天前 Baidu Spider
累计浏览次数:720
评论
点击登录
phpreturn,PHP武器库,专注PHP领域的项目和资讯,收录和介绍PHP相关项目。

本站所有权利归 phpreturn.com 所有

举报/反馈/投稿邮箱:phpreturn@ulthon.com

鲁ICP备19027671号-2