资讯专栏INFORMATION COLUMN

PHP即时通讯设计实现

luckyyulin / 1254人阅读

摘要:即时通讯中,最重要的是响应速度,我们需要展示消息列表那么这时会有未读消息,未读数量,最后一条消息内容,时间等等。目前设计是单表单库。这里只是对即时通讯设计上做了一些简要的阐述,如有疑问和建议,请在评论区回复。

详解即时通讯设计实现(PHP+GatewayWorker+Redis) 需要实现的功能

一对一聊天(私聊)

一对多聊天(群聊)

类似QQ,微信等聊天列表 实时消息 显示

工具选择

GatewayWorker 有如下特性(更多请参考官网手册)

基于Workerman开发

基于Gateway、Worker进程模型

支持分布式部署

支持高并发

支持全局广播或者向任意客户端推送数据

支持各种应用层协议

多协议支持

支持对象或者资源永久保持

高性能

方便与其它项目集成

支持长连接

我们主要使用它的WebSocket通讯协议,并且此框架非常方便的与 ThinkPHP,laravel 等框架结合使用,GatewayWorker可独立部署,php负责相关的业务逻辑

Redis 键值操作,集合列表等。

即时通讯中,最重要的是响应速度,我们需要展示 “消息列表” 那么这时会有 未读消息,未读数量,最后一条消息内容,时间等等。
websocket与GatewayWorker 原理使用 将不再叙述,不懂的童鞋 请上度娘 效果展示

群聊|私聊效果图

消息列表效果图

数据库设计(群聊,私聊 分开) 私聊设计(简要设计)
参数名 说明
id 主键
sender_id 发送者id
receive_id 接收者id
chat_identify 标识 :a与b聊天,b与a聊天。记录 a-b
message_details 消息内容
last_time_at 聊天时间间隔 超过一定时间时记录

chat_identify 字段用处,这个字段是为了更方便的查找 a,b 之间的聊天记录。

last_time_at QQ,微信聊天记录之间,隔一段时间会有 时间 记录,并不显示每一条聊天记录的时间

群聊(简要设计)

与私聊很像,只不过接收者id,变成 group_id 群组id。

消息列表设计,希望看到的效果是 “私聊,群聊”等都在一个列表展示,并且数据实时发生变化。这里借助Redis
每个用户的列表都是一个集合 key = message_list:user_id
Redis集合存储 消息类型 1私信,2群聊

message_list:user_id{
    json_encode(["消息类型","接收者id|群组id"]),
    json_encode(["消息类型","接收者id|群组id"]),
    json_encode(["消息类型","接收者id|群组id"]),
}

查找每个人的消息列表,直接取出该列表即可,但每个成员 都要对应 ‘未读消息数量’,‘最后一条消息内容’,‘最后一条小时时间’。由于是可变的,所以需要多带带存储

Redis 键值 key = message_content:user_id_消息类型_id

key =>json_encode(["消息数量","最后一条消息内容","时间"])

上面 集合列表里的每一个成员都 对应这里的每个键值。

消息更新都要操作Redis,相应的更新内容。

速度上 毋庸置疑,redis 相当的迅速。

需要后续优化的地方

私聊|群聊 记录表。目前设计是单表单库。显然,随着用户量增加,必然爆棚。影响查询的响应速度。

(解决方案无非:分库分表,转移备份历史记录)

GatewayWorker 通讯框架,是单服务器部署,不能支持太高的并发。

这里只是对 即时通讯 设计上做了一些简要的阐述,如有疑问和建议,请在评论区回复。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/92737.html

相关文章

  • PHP即时通讯设计实现

    摘要:即时通讯中,最重要的是响应速度,我们需要展示消息列表那么这时会有未读消息,未读数量,最后一条消息内容,时间等等。目前设计是单表单库。这里只是对即时通讯设计上做了一些简要的阐述,如有疑问和建议,请在评论区回复。 详解即时通讯设计实现(PHP+GatewayWorker+Redis) 需要实现的功能 一对一聊天(私聊) 一对多聊天(群聊) 类似QQ,微信等聊天列表 实时消息 显示 工具...

    asoren 评论0 收藏0
  • PHP即时通讯设计实现

    摘要:即时通讯中,最重要的是响应速度,我们需要展示消息列表那么这时会有未读消息,未读数量,最后一条消息内容,时间等等。目前设计是单表单库。这里只是对即时通讯设计上做了一些简要的阐述,如有疑问和建议,请在评论区回复。 详解即时通讯设计实现(PHP+GatewayWorker+Redis) 需要实现的功能 一对一聊天(私聊) 一对多聊天(群聊) 类似QQ,微信等聊天列表 实时消息 显示 工具...

    leejan97 评论0 收藏0
  • php+ajax实现在线刷新,即时通讯,无需mysql数据库!

    摘要:显示实时刷新的内容页面。存储文本数据。更新插入数据。首先呢,要有发送请求并显示递归调用先执行一次然后通过和关联起来。是一个空文件,你只需要用记事本,新建一个,用来存放表单提交过去的数据,也就是说,其实就是一个数据库。 也不多,就4个文件。ajax.html - 显示实时刷新的内容页面。chat.php - 处理数据。data.dat - 存储文本数据。update.php - 更新/插...

    shleyZ 评论0 收藏0

发表评论

0条评论

luckyyulin

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<