目 录
laychat系统说明
workerman与Thinkphp5整合原理
laychat系统的基础搭建
通用后台的搭建
workerman的集成
layIM的集成
管理员后台功能的实现
后台登录退出的实现
群组管理的设计与实现
群组基础配置
群组管理
用户管理
聊天设置
用户的举报
聊天系统的设计与实现
注册功能的实现
登录功能的实现(1)
登录功能的实现(2)
登录功能的实现(3)
登录功能的实现(4)
修改个人资料的实现
修改个性签名的实现
切换在线状态的实现
添加好友的实现
消息盒子
用意/拒绝好友(1)
同意/拒绝好友(2)
好友聊天的实现
创建群组的实现
按条件查找群组
申请加入群组
管理我的群组
群组聊天
右键退出群组
发送语音
发送图片
发送文件
用户空间功能
查看聊天记录
本文档使用 看云 构建
- 2 -
进入好友空间
将好友加入黑名单
移动好友分组
删除好友
举报好友
数据字典
全国区域数据
系统整体结构说明
Events.php全部代码
main.js全部代码
laychat系统源码
本文档使用 看云 构建
- 3 -
laychat系统说明
laychat系统说明
ThinkPHP5+workerman+layIM打造聊天系统---laychat
ThinkPHP5 是ThinkPHP 3.X系列之后的重量级产品,以出色的架构设计,强劲的性能闻名。很适合我们快
速的开发成熟的商用系统。到目前为止,github上也出现了很多成熟的thinkphp5快速开发的通用后台产
品。在这里给自己的一个项目做个广告:snake通用后台,算的上最早的一批tp5通用后台了,功能很简
单,便于新手快速的理解和使用tp5。到写作此文章开始,已经有135个star了。
Workerman是一款纯PHP开发的开源高性能的PHP socket 服务器框架。被广泛的用于手机app、移动通
讯,微信小程序,手游服务端、网络游戏、PHP聊天室、硬件通讯、智能家居、车联网、物联网等领域的
开发。 支持TCP长连接,支持Websocket、HTTP等协议,支持自定义协议。拥有异步Mysql、异步
Redis、异步Http、异步消息队列等众多高性能组件。它的作者是来自鹅厂的大神。本系统 laychat 采用的
是 Wokerman的 GatewayWorker3.X系列框架。文档可参考:GetwayWorker手册
layIM是原阿里的大神 贤心倾力打造的一款Web即时通讯前端解决方案。界面优美,功能强悍,仿真度
高。官网:layim官网,手册:layim手册
聊天部分功能清单
聊天用户的注册
聊天用户的登录
修改个人资料
修改个性签名
切换在线状态
按条件搜索添加好友
系统消息盒子
添加好友申请与同意/拒绝好友
好友聊天
创建群组
按条件查找群
申请加入群组
管理我的群组
群组聊天
右键退出我的群组
聊天发送语音
聊天发送图片
聊天发送文件
空间的说说发表,评论功能
查看个人和群聊记录
本文档使用 看云 构建
- 4 -
laychat系统说明
好友右键功能
1. 进入好友空间
2. 将好友加入黑名单
3. 移动好友分组
4. 删除好友
5. 举报好友
大致了解一下外观
了解外观
本系统用到的全部源码
我会在本套教程中,全部展示这些源码,展示源码的方式如:
// +----------------------------------------------------------------------
namespace app\admin\controller;
use think\Controller;
class Chat extends Controller
{
public function index()
{
if(request()->isPost()){
$data = input('post.');
$data['file_ext'] = trim($data['file_ext']);
$data['img_ext'] = trim($data['img_ext']);
writeCtConfig($data);
return json(['code' => 1, 'data' => '', 'msg' => '配置成功']);
}
$config = readCtConfig();
empty($config) &&
$config = ['file_size' => 2, 'file_ext' => 'zip|rar', 'img_size' => 2, 'img_ext
' => 'png|jpg|gif'];
$this->assign([
'config' => $config,
'up_size' => ini_get('upload_max_filesize')
]);
return $this->fetch();
}
}
你可以跟着教程,一步一步搭建属于自己的 webIM系统。
本文档使用 看云 构建
- 5 -
laychat系统说明
此外,你也可以打开 《laychat系统源码》 这一章节,进行下载。
本地环境的注意事项
本次系统演示,采用的 phpstudy 这个集成环境,php版本为 5.6.27。服务器 以apache 为例,请保持与我一
致,或者自己修改其中不兼容的部分。
其他建议
1. 本套系统牵扯到的 websocket相关的知识,以及tcp协议的相关知识,不懂的可以百度做一些功课。也可
以通过我的博客:我的博客,了解一些相关的知识。
2. 本系统是基于windows平台的学习版本,当然你只需要下载linux版本的workerman即可轻松的实现linux平
台下的应用,为了演示和学习的方便,本系统基于windows平台下讲解。
3. 数据库不了解功能的 可以参考 《数据字典》 这一章节。
4. 由于讲解这个教程的时候,我的代码已经完成了,没办法一步一步的完全拆开介绍。因此,我会先全部放
出完成的js代码,然后顺着js的接口,一步一步的对php代码和workerman代码进行讲解。这些js代码,我
会首先放出,方便你在跟着教程的同时,有代码依据。
5. 有些workerman和layIM中的方法,可能没有讲到,如有不理解的,可以自行查找手册。手册写的都很明
确。
郑重声明
本系统用到的 layIM 为非开源程序。请务必到官网进行授权获得资源。本教程源码部分,不会放出
layim.js 这个源码。
本文档使用 看云 构建
- 6 -
workerman与Thinkphp5整合原理
workerman与Thinkphp5整合原理
看到一些人,可能不太明白workerman与thinkphp5是怎么工作的,这里,我引用workerman官方的文章来解
释一下,希望给你们一些参考。
与ThinkPHP等框架结合
使用GatewayWorker时开发者最关心的是如何与现有mvc框架(ThinkPHP Yii laravel等)整合,以下是官方推荐
的整合方式。见示意图:
总体原则:
现有mvc框架项目与GatewayWorker独立部署互不干扰
所有的业务逻辑都由网站页面post/get到mvc框架中完成
GatewayWorker不接受客户端发来的数据,即GatewayWorker不处理任何业务逻辑,GatewayWorker仅仅当
做一个单向的推送通道
仅当mvc框架需要向浏览器主动推送数据时才在mvc框架中调用Gateway的API(GatewayClient)完成推送
具体实现步骤
1、网站页面建立与GatewayWorker的websocket连接
2、GatewayWorker发现有页面发起连接时,将对应连接的client_id发给网站页面
3、网站页面收到client_id后触发一个ajax请求(假设是bind.php)将client_id发到mvc后端
4、mvc后端bind.php收到client_id后利用GatewayClient调用Gateway::bindUid($client_id, $uid)将client_id与
当前uid(用户id或者客户端唯一标识)绑定。如果有群组、群发功能,也可以利用
本文档使用 看云 构建
- 7 -
workerman与Thinkphp5整合原理
Gateway::joinGroup($client_id, $group_id)将client_id加入到对应分组
5、页面发起的所有请求都直接post/get到mvc框架统一处理,包括发送消息
6、mvc框架处理业务过程中需要向某个uid或者某个群组发送数据时,直接调用GatewayClient的接口
Gateway::sendToUid Gateway::sendToGroup 等发送即可
示例代码
GatewayWorker中Events.php代码(只有个onConnect回调设置)
'init',
'client_id' => $client_id
)));
}
// GatewayWorker建议不做任何业务逻辑,onMessage留空即可
public static function onMessage($client_id, $message)
{
}
}
网站页面js片段
/**
* 与GatewayWorker建立websocket连接,域名和端口改为你实际的域名端口,
* 其中端口为Gateway端口,即start_gateway.php指定的端口。
* start_gateway.php 中需要指定websocket协议,像这样
* $gateway = new Gateway(websocket://0.0.0.0:7272);
*/
ws = new WebSocket("ws://your_domain.com:7272");
// 服务端主动推送消息时会触发这里的onmessage
ws.onmessage = function(e){
// json数据转换成js对象
var data = eval("("+e.data+")");
var type = data.type || '';
switch(type){
// Events.php中返回的init类型的消息,将client_id发给后台进行uid绑定
case 'init':
// 利用jquery发起ajax请求,将client_id发给后端进行uid绑定
$.post('./bind.php', {client_id: data.client_id}, function(data){}, 'json')
;
break;
// 当mvc框架调用GatewayClient发消息时直接alert出来
default :
alert(e.data);
}
};
本文档使用 看云 构建
- 8 -