龙空技术网

超详细讲解thinkPHP6+gatewayWorker开发即时通讯,避坑

A说股论金 103

前言:

而今小伙伴们对“php实现即时通讯”大体比较着重,我们都需要了解一些“php实现即时通讯”的相关资讯。那么小编同时在网上收集了一些关于“php实现即时通讯””的相关内容,希望小伙伴们能喜欢,小伙伴们一起来学习一下吧!

最近要做一个即时通讯(聊天)功能,本身这个功能挺常见,这篇文章主要是记录自己开发过程中遇到的一些问题,下次要做同样的功能,可以快速开发出来。

技术选择

PHP做即时通讯,选择不多,基本就是 workerman swoole

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>

标签: #php实现即时通讯 #phpworker