ThinkPHP 5.1+PHPSocket.IO实现websocket搭建聊天室+私聊

关于使用ThinkPHP 5.1 + PHPSocket.IO搭建简单的websocket聊天案例见之前的一篇文章(ThinkPHP 5.1下使用PHPSocket.IO实现websocket通讯),在此基础上做了较大的更新,本项目github地址:

https://github.com/hsu1943/thinksocketio

本项目持续更新,有用到的朋友不要忘了点一下STAR,谢谢!

鉴于大家对这一功能是需求很多,对之前的简单的消息推送做了功能更新,主要功能在下面,前端界面实在看不下去,仅仅实现功能,更多的是让大家理解如何去搭建。

部分功能截图

公频聊天:

websocket聊天室

一对一私聊

websocket一对一私聊

广播推送系统消息

ThinkPHP 5.1+PHPSocket.IO广播推送系统消息

指定用户推送消息
ThinkPHP 5.1+PHPSocket.IO指定用户推送消息

目前功能(截至2019年1月23日)

  1. 公频聊天
  2. 一对一私聊
  3. 加入聊天室提示
  4. 离开聊天室提示
  5. 私聊消息在公频提醒

数据库

为了记录聊天记录使用了两张数据表,如果不需要记录可以将代码中写入消息操作的代码注释即可。

消息记录msg表

CREATE TABLE `msg` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `msg` varchar(255) DEFAULT NULL COMMENT '消息',
  `from` varchar(255) DEFAULT NULL COMMENT '来自用户',
  `to` varchar(255) DEFAULT NULL COMMENT '发送给用户',
  `type` varchar(10) DEFAULT NULL COMMENT '消息类型',
  `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '发送时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=213 DEFAULT CHARSET=utf8mb4 COMMENT='消息记录';

后期计划加入功能

  1. 聊天室人数统计(已完成)
  2. 私聊消息提醒 (已完成)
  3. 自定义用户昵称 (已完成)
  4. 历史消息查看
  5. 输入中状态提示

以上功能会陆续加入,视博主时间而定,具体更新时间不做承诺。本文会随着功能更新保持更新,以下内容未更新记录。

使用说明

以下说明假定已经为项目public目录绑定了域名test.com并正确部署服务器,访问test.com能看到TP5默认首页。

如果修改了配置或者代码,请重新运行服务端,否则代码不生效。

安装

git clone git@github.com:hsu1943/thinksocketio.git
cd thinksocketio
composer install -vvv

配置

模板文件/application/socketio/view/index/index.html/application/socketio/view/index/chat.htmlsocket修改为你的socket服务端地址,默认测试端口2021,端口号可以在/config/socketio/param.php中配置。这里是本机测试,用http://127.0.0.1:2021

var socket = io('http://127.0.0.1:2021');

使用数据库记录消息:

如果你需要使用数据库存储消息,按照下面的步骤打开配置,打开配置后系统会根据昵称将所有聊天记录写入数据库msg表中,包括主动推送的消息;

  1. config/database.php中配置数据库,保证数据库能正确连接;
  2. 导入根目录下msg.sql到数据库;
  3. config/socketio/param.php中将save_msg修改为true(默认是false,不写入到数据库);

这里说明一下,请保证数据库能正确连接并且里面有正确的表结构(第二步导入表)再进行第三步配置。

主动推送系统消息接口

修改配置文件/config/socketio/param.php中的配置为监听消息推送地址,这里本地测试,使用本地2121端口;

return [
    'ws' => [
        'apiHost' => 'http://127.0.0.1:2121',
    ],
];

该地址即系统推送消息地址,参数:

to:接收人
content:消息

两种用法:

  1. 其他项目POST或GET请求接口即可推送消息
向username推送系统消息
http://test.com/system?to=username&content=系统推送消息测试
广播消息
http://test.com/system?content=系统推送消息测试

http://test.com/system这是本项目使用上面的监听地址做的一个消息推送demo,详情看源代码。

  1. 本项目中推送系统消息:

已将推送封装在Msg的模型中,使用:

$res = Msg::send($to, $content);
return $res == 'ok' ? '系统消息推送成功' : '系统消息推送失败';

测试

运行服务端:

php ./public/server.php

这里可以将输出写到某个日志文件中,或者使用supervisor来管理服务端。

访问以下地址即可进入公频:

http://test.com/socketio

点击消息列表中的用户名即可进入私聊。

更新

  • 2019-12-19 增加服务端的输出,以及端口配置项,保存数据库加上错误处理,更新项目README;
  • 2019-06-19 增加在线人数统计,在线用户列表,修改昵称,添加系统主动推送接口(广播或私信);

ThinkPHP 5.1+PHPSocket.IO实现websocket搭建聊天室+私聊

原文链接:https://beltxman.com/2329.html,若无特殊说明本站内容为行星带原创,未经同意禁止转载!

更多精彩,敬请关注本博微信公众号:hsu1943

ThinkPHP 5.1+PHPSocket.IO实现websocket搭建聊天室+私聊”上有 11 条评论;

  1. 我有时推完消息,服务端自己就挂了。没找到原因一直。

    1. git pull更新项目代码,把/config/socketio/param.php里面的save_msg设置为false如果是正常的话,就是数据库连接或者数据表未导入的问题。

  2. 项目部署确实很费劲,
    首先按照readme中命令,执行
    git clone git@github.com:hsu1943/thinksocketio.git
    提示:
    Permission denied (publickey).
    fatal: Could not read from remote repository.

    需要换成https://github.com/hsu1943/thinksocketio.git进行git
    git clone https://github.com/hsu1943/thinksocketio.git

    下载之后,cd thinksocketio
    然后执行 composer install
    又出现Failed to download topthink/think-installer from dist错误。
    没办法,自己动手丰衣足食呗。
    分别下载ThinkPHP5.1和PHPSocket.IO,
    东拼西凑,终于项目能够运行了,
    启动3个浏览器A、B、C作为客户端
    A发消息,A、B、C都能收到
    B发消息,B、C可以收到
    C发消息,C可以收到,
    这是什么情况,怎么变成漏斗模型了呢?

    查看后台日志发现,每当客户端发送完消息后,
    后台日志显示 A disconnect/B disconnect/C disconnect
    也就是说,发送完一条消息后,自己就退出了,这是什么鬼啊?

    1. 你最后的问题应该是数据库数据库配置导致服务端写入数据库报错执行中断,你应该配置好数据库连接,根据我的说明建好存储表,我把这个地方改一下好了,免得都忘记建表的情况导致程序不允许。
      至于前面的部署,基本就是拉项目,composer一下,就可以了,当然也可以自己拉TP,然后把PHPSocket.IO加入到composer,然后把我项目中的控制器及入口文件和模板复制过去,一样用,懂得原理最重要,部署都是基本操作。

      你遇到的问题

      第一个:我项目是公开的,怎么拉到本地应该不是问题;
      第二个:问题是拉取tp核心的时候报错,可能他们的拉取方式做了改动,去看看tp官网对着修改一下composer.json即可,所以都不是问题。

  3. 下载了你的项目不能很友好的运行 希望能够得到你的指点 我的q 799345375

    1. 如果你方便就加一下qq沟通一下 不方便就算了

评论已关闭。

Scroll to top