php即时聊天的框架_PHP框架实现WebSocket在线聊天通讯系统

ThinkPHP使用Swoole需要安装think-swoole Composer包,前提系统已经安装好了Swoole PECL 拓展

tp5的项目根目录下执行composer命令安装think-swoole:

composer require topthink/think-swoole

话不多说,直接上代码:

新建WebSocket.php控制器:

(监听端口要确认服务器放行,宝塔环境还需要添加安全组规则)

namespace app\home\controller;

use think\swoole\Server;

class WebSocket extends Server

{

protected $host = '0.0.0.0'; //监听所有地址

protected $port = 9501; //监听9501端口

protected $serverType = 'socket';

protected $option = [

'worker_num'=> 4, //设置启动的Worker进程数

'daemonize' => false, //守护进程化(上线改为true)

'backlog' => 128, //Listen队列长度

'dispatch_mode' => 2, //固定模式,保证同一个连接发来的数据只会被同一个worker处理

//心跳检测:每60秒遍历所有连接,强制关闭10分钟内没有向服务器发送任何数据的连接

'heartbeat_check_interval' => 60,

'heartbeat_idle_time' => 600

];

//建立连接时回调函数

public function onOpen($server,$req)

{

$fd = $req->fd;//客户端标识

$uid = $req->get['uid'];//客户端传递的用户id

$token = $req->get['token'];//客户端传递的用户登录token

//省略token验证逻辑......

if (!$token) {

$arr = array('status'=>2,'message'=>'token已过期');

$server->push($fd, json_encode($arr));

$server->close($fd);

return;

}

//省略给用户绑定fd逻辑......

echo "用户{$uid}建立了连接,标识为{$fd}\n";

}

//接收数据时回调函数

public function onMessage($server,$frame)

{

$fd = $frame->fd;

$message = $frame->data;

//省略通过fd查询用户uid逻辑......

$uid = 666;

$data['uid'] = $uid;

$data['message'] = '用户'.$uid.'发送了:'.$message;

$data['post_time'] = date("m/d H:i",time());

$arr = array('status'=>1,'message'=>'success','data'=>$data);

//仅推送给当前连接用户

//$server->push($fd, json_encode($arr));

//推送给全部连接用户

foreach($server->connections as $fd) {

$server->push($fd, json_encode($arr));

}

}

//连接关闭时回调函数

public function onClose($server,$fd)

{

echo "标识{$fd}关闭了连接\n";

}

}

前端演示页面:

(省略控制器判断登录状态、分配数据逻辑......)

Chat

在线聊天

$(function () {

var uid = 666;//当前用户id

var token = 'abcdefg';//用户token

//判断浏览器是否支持WebSocket

var supportsWebSockets = 'WebSocket' in window || 'MozWebSocket' in window;

if (supportsWebSockets) {

//建立WebSocket连接(ip地址换成自己主机ip)

var ws = new WebSocket("ws://127.0.0.1:9501?uid="+uid+"&token="+token);

ws.onopen = function () {

layer.msg('服务器连接成功',{shade:0.1,icon:1,time:600});

};

ws.onerror = function () {

layer.msg('服务器连接失败',{shade:0.1,icon:2,time:600});

};

ws.onmessage = function (evt) {

var data = $.parseJSON(evt.data);

//错误提示

if(data.status != 1){

layer.alert(data.message,{icon:2});

return;

}

//消息返回

if (data.status==1 && data.data.message!='') {

var html = "";

if (data.data.uid == uid) {

html += "

"+data.data.post_time+"
\"\"

"+data.data.message+"

";

}else{

html += "

"+data.data.post_time+"
\"\"

"+data.data.message+"

";

}

}

$(".message").append(html);

setTimeout(function () {

($('.message').children("div:last-child")[0]).scrollIntoView();//向上滚动

},100);

};

ws.onclose = function (res) {

};

//按钮发送

$("#sendBtn").click(function () {

var contents = $("#msg").val().trim();

if(contents == null || contents == ""){

layer.msg('内容为空',{shade:0.1,icon:2,time:600});

return false;

}else{

ws.send(contents);

$("#msg").val("");

}

});

//回车发送

$("#msg").keydown(function (evel) {

var that = $(this);

if (evel.keyCode == 13) {

evel.cancelBubble = true;

evel.preventDefault();

evel.stopPropagation();

var contents = that.val().trim();

if(contents == null || contents == ""){

layer.msg('内容为空',{shade:0.1,icon:2,time:600});

return false;

}else{

ws.send(contents);

that.val("");

}

}

});

}else{

layer.alert("您的浏览器不支持 WebSocket!");

}

});

服务器移到项目根目录开启服务:

php public/index.php Websocket/start

这里的路径,是因为我绑定了home模块为默认模块,tp5默认情况是:php public/index.php index/Websocket/start)

开启成功,查看端口已经被监听:

lsof -i:9501

很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家 ,需要 请戳这里

总结

以上所述是小编给大家介绍的PHP框架实现WebSocket在线聊天通讯系统,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
相关推荐
PHP写得及时聊天工具,结构设计的很好,有源码。是学习PHP的好资料 JeCat-Jabber(简称:JJ) 是一款完全由 PHP 开发的即时通讯软件。JJ 采用 Gtk2 图像界面库来实现用户界面。顾名思义 JJ 使用 Jabber 协议(XMPP) ,因此可以 和 包括 GTalk 在内的 其它任何 XMPP 即时通讯软件 聊天。 JJ 项目的初衷在于 演示 桌面窗口 和 PHP 多任务处理,这两大 在长期在 PHP程序员 眼中 几乎是“不可能”的任务。 同时 也是 PHP框架 JCAT 的演示项目,JCAT 是一款同时 支持 Web 和 桌面 的 PHP框架,按照计划 将在稍后 发布。 JJ 的特点 > 跨平台。JJ 在Linxu 环境下 开发,在 Windows 平台上也一样可以正常使用。 > 实用 标准的 XMPP协议,能够与其它的 Jabber 软件互相通讯,例如 Google GTalk、Pidgin、PSI、Spark、Pandion,以及其它的 Jabber网页聊天窗口 > 可更换界面皮肤,皮肤样式文件 采用 类似 CSS 的语法,便于美工独立工作。 > 纯 PHP 实现,从 通讯协议 到 图形界面,全部都由 PHP 开发,如果你正好是一名 PHP 程序员,你可以驾轻就熟地在 JJ 之上进行二次开发。 > 可整合到你的网站中。JJ 近期的完善 会使 JJ 更容易地 为你的网站所有,让你的网站 也可以有像 淘宝旺旺 那样的 专用聊天工具 [ PHP 图像界面 ] JJ 采用 Gtk图像界面库,Gtk库 中 提供了丰富的 图形界面窗体(Widget),以及灵活方便的 窗体布局方式。 Gtk 本身 被广泛应用在 Linux 平台上,Linux 最著名 的桌面环境之一 Gnome 即是众多 Gtk软件 的集中展示。 PHP-Gtk2 将 Gtk 窗体绑定到 PHP 语言中,允许程序员 通过 PHP语言 来创建、显示、销毁 Gtk 窗体。PHP-Gtk 项目由 PHP创始人 亲自负责,并且自项目创立一来 一直持续发展,目前已经支持 最新的 Gtk2。 [ PHP 多任务处理 ] PHP 直到 5.2都没有提供 稳定可靠的 多线程特性。 但 PHP 仍然有能力进行多任务处理。 多线程 因为涉及到 线程安全、线程同步 等 困难,在 支持线程的语言中,也常常建议尽量避免使用。 Linux 的多路复用 是 更稳定和安全的 多任务模式,从 PHP5.0 开始 多路复用 支持 Windows 平台。
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页