前言:
而今小伙伴们对“php实现即时通讯”大体比较着重,我们都需要了解一些“php实现即时通讯”的相关资讯。那么小编同时在网上收集了一些关于“php实现即时通讯””的相关内容,希望小伙伴们能喜欢,小伙伴们一起来学习一下吧!最近要做一个即时通讯(聊天)功能,本身这个功能挺常见,这篇文章主要是记录自己开发过程中遇到的一些问题,下次要做同样的功能,可以快速开发出来。
技术选择
PHP做即时通讯,选择不多,基本就是 workerman 与swoole
Swoole 使用 C/C++ 语言编写,提供了 PHP 语言的异步多线程服务器、异步 TCP/UDP 网络客户端、异步 MySQL、异步 Redis、数据库连接池、AsyncTask、消息队列、毫秒定时器、异步文件读写、异步 DNS 查询。 Swoole 内置了 Http/WebSocket 服务器端/客户端、Http2.0 服务器端。
其实挺强大,速度应该也挺快,再看看workerman。
workerman是一款开源高性能PHP应用容器,它大大突破了传统PHP应用范围,被广泛的用于互联网、即时通讯、APP开发、硬件通讯、智能家居、物联网等领域的开发。
workerman 是纯PHP开发的,简单易上手。
Swoole的老大说,Swoole是给高手用的,门槛比较高,需要使用者有深厚的功底。确实比较难上手,比较高傲,所以转头我就选择了好上手的workerman。
不排除还有一些其他好用的即时通讯框架,我就没有去细找了。
官网地址
安装GatewayWorker
GatewayWorker基于Workerman开发的一个项目框架,用于快速开发TCP长连接应用,例如app推送服务端、即时IM服务端、物联网、智能家居等等,GatewayWorker使用经典的Gateway和Worker进程模型。
可以去这里下载源码,或者去下载一个demo
当然,在thinkPHP项目里面直接用下面的命令最好,安装核心依赖
composer require workerman/gateway-worker
以上都是官方的,还有些phper自己也封装了一些,开源出来供大家使用比如think-worker,不过我还是建议直接用官方的比较好,其他phper搞出来的,要么是方便自己的项目封装,做了相应的处理,要么功能会有阉割,还有的是文档不那么全,遇到问题可能是两眼一抹黑。
启动服务
安装完成之后,可以直接运行一下命令(Windows上面不支持)
php think worker:gateway
出现以下界面,说明安装成功
官方手册
注意,启动和停止与官方手册有差别。
守护进程模式:
php think worker:gateway -d配置
基本上能正常启动服务,接下来就是开发功能了,但是开发前,还需要做一些配置。
安装之后,会在thinkPHP项目配置目录生成一个gateway_worker.php 文件,这个文件就是用来做配置的。
此配置文件有三个需要注意的地方。1,protocol 需要什么协议,可支持的都在后面有备注;2,监听的地址和端口,可以就用默认的,但是要注意在服务器上放开端口;3,eventHandler 事务处理,可以在这个文件里面监听各事件回调,在这里就可以写我们的即时通讯功能了。
客户端
客户端比较简单,直接贴一份很简洁的代码
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<textarea name="" id="txt" cols="30" rows="10">
</textarea>
<button onclick="send()" >发送</button>
</body>
<script>
let ws = new WebSocket('ws://192.168.2.30:2346')
// 连接成功后的回调函数
ws.onopen = function (params) {
console.log('客户端连接成功')
// 向服务器发送消息
ws.send('hello')
};
// 从服务器接受到信息时的回调函数
ws.onmessage = function (e) {
console.log('收到服务器响应', e.data)
};
// 连接关闭后的回调函数
ws.onclose = function(evt) {
console.log("关闭客户端连接");
};
// 连接失败后的回调函数
ws.onerror = function (evt) {
console.log("连接失败了");
};
function send(){
let val=document.getElementById('txt').value;
console.log('---',val)
ws.send(val)
}
</script>
</html>