如果作为一道应用题,这题没什么意义,因为任何应用涉及到数据存储,最基本的方案就是用数据库,对于博客网站也可能采用文件存储,其他的更高级的方案基本都是这种方案的演变。
但如果作为一个脑洞题,还是比较有意思的。
假设我们要用PHP来实现一个网站,除了基本的页面浏览,还要实现用户之间实时聊天,那么技术栈很明确了,除了一般的技术要求,还需要websocket这种东西,而PHP实现websocket服务有很多方法,比如:workerman、swoole等等。(但本文不去讨论太多的技术实现,讨论一下方案的设计思路)。
当我们实现了websocket服务之后,对于长连接传输的数据(聊天数据),如何在不使用数据库的情况下存储呢?答案是:“不存储”,不存储自然就不需要数据库了。
但是不存储,难道用户每次刷新就会丢失历史记录吗?
并不是,这里我们只是不让“服务端”去存储,让客户端自己想办法存储,比如在浏览器中,把数据存到localStorage中,甚至可以把聊天记录导出为某个格式,比如:“JSON”。
即在我们设计的这套可以聊天的PHP系统中,PHP提供的是一个开放的标准的聊天规则,至于具体的数据存储,由客户端自行解决。
他可以把json另存为一个文件,也可以发送到微信的“文件传输助手里”,也可以背下来,每次导入的时候一点一点输入。
但是这样做会有很多的问题需要解决,比如聊天记录的可靠性,如果有人把JSON导出之后,修改了一些内容,再导入到系统中,聊天用户双方如何去甄别这个事呢?
我们可以这样设计,导出的JSON中,不仅有自己的聊天数据,也有对方的聊天数据,并且每个数据都有至少有这四个属性:内容、时间戳、MD5签名、UUID。这里的MD5签名即内容+时间戳的签名。当双方加入到聊天室时,要把本地的聊天记录都交换并渲染到页面上。其中对于双方都一致的数据正常显示,对于不一致的,可以在这条数据旁边加上一个叹号,并标注具体的原因,比如:
- 该记录本地无存储(由对方伪造的或者该记录在本地被删除了)
- 该记录被篡改(双方的UUID一致,但是签名不一致)
等等各种情况。
这样的话,虽然要处理很多的边界情况,但是“服务端”不需要处理数据,只是提供一个长连接推送能力就行了。而处理的这些边界情况,大多数是因为“服务端不愿意存储数据”造成的。
然而无论怎样去设计这样一个系统,聊天双方还是需要依赖服务端去实现一些功能,比如:身份验证。否则用户双方就很难识别对方的身份是不是伪造的了,总不能聊天之前互相验证一下预留的暗号吧。
“地瓜地瓜,我是土豆,我是土豆,听到请回答。”
“对不起,你的接头暗号错了,对方拒绝和你聊天。”
原文标题:不使用数据库和文件作为存储,如何实现PHP网站访客之间的聊天?
原文地址:https://phpreturn.com/index/a649b8f8e1fbee.html
原文平台:PHP武器库
版权声明:本文由phpreturn.com(PHP武器库官网)原创和首发,所有权利归phpreturn(PHP武器库)所有,本站允许任何形式的转载/引用文章,但必须同时注明出处。