搜索
首页php框架ThinkPHP使用 Workman 做一个聊天室
使用 Workman 做一个聊天室Jun 21, 2019 pm 02:52 PM
tp聊天室

使用 Workman 做一个聊天室

为什么要写这篇文章?

我学习Workman好几次了,每次都失败(没做成想要的功能,原谅我比较笨)。但是这次也花了好几个小时,把之前没做成的功能实现了。其实就是两个简单的功能:一对一发送消息,广播消息(群聊)。这个功能用swoole早都实现了,也是由于之前一直想用 think-worker 的原因,想想还是得自己琢磨才行,人家做好的框架或许是个阉割版。

别问我为什么不用swoole,因为 workman 可以在Windows中运行。

(1)首先,得简单说说 thinkphp+workerman 的安装。

安装 thinkphp5.1

composer create-project topthink/think=5.1.x-dev tp5andworkman

安装 think-worker

composer require topthink/think-worker=2.0.*

直接安装 workman

composer require workerman/workerman

(2)我们先看 think-worker 的代码

  • config/worker_server.php

  • 先来个服务器广播消息的示例,每10秒钟定时广播一条消息

'onWorkerStart'  => function ($worker) {
    \Workerman\Lib\Timer::add(10, function()use($worker){
        // 遍历当前进程所有的客户端连接,发送自定义消息
        foreach($worker->connections as $connection){
            $send['name'] = '系统信息';
            $send['content'] = '这是一个定时任务信息';
            $send['time'] = time();
            $connection->send(json_encode($send));
        }
    });
}

但是在 onMessage 时,我们获取不到 $worker 对象,所以无法广播消息。

'onMessage'      => function ($connection, $data) {
    $origin = json_decode($data,true);
    $send['name'] = '广播数据';
    $send['content'] = $origin['content'];
    $message = json_encode($send);

    foreach($worker->connections as $connection)
    {
        $connection->send($message);
    }
}

尝试了各种方法,貌似都不行

'onMessage'      => function ($connection, $data)use($worker) {
    // 这样是获取不到 $worker 对象的
    // ...省略代码
}

所以只能抛弃 thinkphp 给我们封装的 think-worker 框架,得自己写,(或者修改框架内部代码)

修改框架内部的代码:/vendor/topthink/think-worker/src/command/Server.php,主要是把 onMessage 方法自己加进去

use() 就是把外部变量传递到函数内部使用,或者使用global $worker

$worker = new Worker($socket, $context);

$worker->onMessage = function ($connection, $data)use($worker) {
    $origin = json_decode($data,true);
    $send['name'] = '广播数据';
    $send['content'] = $origin['content'];
    $send['uid'] = $connection->uid;
    $message = json_encode($send);
    foreach($worker->connections as $connection)
    {
        $connection->send($message);
    }
};

这样,我们就能够获取到 $worker 对象了

$worker->onMessage = function ($connection, $data)use($worker) { ... }

(3)$connection 绑定 uid

其实你早都已经看出,$worker->connections 获取到的是当前所有用户的连接,connections 即为其中一个链接。

记录websocket连接时间:

$worker->onConnect = function ($connection) {
    $connection->login_time = time();
};

获取websocket连接时间:

$worker->onMessage = function ($connection, $data)use($worker) {
    $login_time = $connection->login_time;
};

由此可以看出,我们可以把数据绑定到 $connection 连接的一个属性,例如:

$connection->uid = $uid;

当JavaScript端在连接websocket服务器成功后,即把自己的 uid 立马发送服务端绑定:

$worker->onMessage = function ($connection, $data)use($worker) {
    $origin = json_decode($data,true);
    if(array_key_exists('bind',$origin)){
        $connection->uid = $origin['uid'];
    }
};

(4)单播发送消息,即自定义发送

$worker->onMessage = function ($connection, $data)use($worker) {
    $origin = json_decode($data,true);
    $sendTo = $origin['sendto']; // 需要发送的对方的uid
    $content = $origin['content']; // 需要发送到对方的内容
    foreach($worker->connections as $connection)
    {
        if( $connection->uid == $sendTo){
            $connection->send($content);
        }
    }
};

到此,已经完成基于 workman 的自定义对象发送消息。

由于该php文件存放于composer中,只需要把该文件复制出来,放到application/command,修改命名空间,即可保存到自己的项目中

(5)对比swoole

1、workman可以在windows系统中运行,swoole则不能。

2、workman:$worker->connections获取所有连接,$connection->id获取自己的连接id;swoole:$server->connections获取所有连接,$connection->fd获取自己的连接id。

3、workman启动时执行 onWorkerStart 方法,可以把定时器写入到里面;swoole 使用 WorkerStart 启动定时器。

仅仅于聊天室或者定时器而言,workman 还是比较方便的。

更多ThinkPHP相关技术文章,请访问ThinkPHP使用教程栏目进行学习!

以上是使用 Workman 做一个聊天室的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
如何使用MySQL和Java实现一个简单的聊天室功能如何使用MySQL和Java实现一个简单的聊天室功能Sep 21, 2023 pm 05:13 PM

如何使用MySQL和Java实现一个简单的聊天室功能引言:在当今社交媒体的盛行下,人们越来越依赖于在线聊天来交流和分享信息。如何使用MySQL和Java实现一个简单的聊天室功能是一个非常有趣和实用的项目。本文将介绍如何使用MySQL和Java来实现这一功能,并提供具体的代码示例。一、搭建数据库首先,我们需要在MySQL中创建一个数据库来存储聊天室的相关信息。

如何使用Go语言开发Websocket聊天室如何使用Go语言开发Websocket聊天室Dec 14, 2023 pm 01:46 PM

如何使用Go语言开发Websocket聊天室Websocket是一种实时通信协议,通过建立一次连接,可以在服务器和客户端之间进行双向通信。在开发聊天室时,Websocket是一个非常好的选择,因为它可以实现实时消息交流,并且能够提供高效的性能。本文将介绍如何使用Go语言开发一个简单的Websocket聊天室,并提供一些具体的代码示例。一、准备工作1.安装Go

基于JavaScript构建实时聊天室基于JavaScript构建实时聊天室Aug 10, 2023 pm 11:18 PM

基于JavaScript构建实时聊天室随着互联网的快速发展,人们越来越注重即时通讯和实时互动体验。而实时聊天室作为一种常见的即时通讯工具,对于个人和企业来说都非常重要。本文将介绍如何使用JavaScript构建一个简单的实时聊天室,并提供相应的代码示例。我们首先需要一个前端页面作为聊天室的UI界面。以下是一个简单的HTML结构示例:<!DOCTYPE

TP6 Think-Swoole RPC服务的性能优化与调试TP6 Think-Swoole RPC服务的性能优化与调试Oct 12, 2023 am 11:16 AM

TP6Think-SwooleRPC服务的性能优化与调试一、引言随着互联网的迅猛发展,分布式计算已经成为了现代软件开发中不可或缺的一部分。在分布式计算中,RPC(RemoteProcedureCall,远程过程调用)是一种常用的通信机制,通过它可以实现跨网络的方法调用。Think-Swoole作为一个高性能的PHP框架,可以很好地支持RPC服务。但是

ThinkPHP6聊天室开发指南:实现实时通讯功能ThinkPHP6聊天室开发指南:实现实时通讯功能Aug 12, 2023 pm 02:31 PM

ThinkPHP6聊天室开发指南:实现实时通讯功能引言:随着互联网的快速发展,实时通讯的需求也越来越大。聊天室作为一种常见的实时通讯方式,受到了广泛的关注和使用。本文将通过使用ThinkPHP6框架,为大家提供一种简单、快速实现实时通讯功能的方法。一、环境配置:在开始之前,我们需要配置好开发环境。确保你已经安装了PHP和ThinkPHP6框架。同时,本文将使

利用php和Websocket开发聊天室功能利用php和Websocket开发聊天室功能Dec 02, 2023 am 11:08 AM

利用PHP和Websocket开发聊天室功能引言:随着互联网的迅猛发展,聊天室已经成为人们日常交流和社交的重要手段之一。利用PHP和Websocket技术开发一个聊天室功能可以实现实时的双向通信,为用户提供更流畅便捷的聊天体验。本文将介绍如何使用PHP和Websocket来实现一个简单的聊天室,并提供具体的代码示例。一、准备工作:在开始开发之前,我们需要确保

Swoole实战:快速打造基于WebSocket的聊天室Swoole实战:快速打造基于WebSocket的聊天室Jun 14, 2023 pm 04:20 PM

在互联网时代,聊天室成为了人们交流、社交的一个重要场所。而WebSocket技术的出现,则使得实时通信变得更为流畅、稳定。今天,我们介绍如何利用Swoole框架快速搭建一个基于WebSocket的聊天室。Swoole是一款高性能的PHP协程网络通信框架,采用C语言编写,集异步IO、协程、网络通信等功能于一身,使得PHP代码能够像Node.js

使用PHP实现聊天室功能使用PHP实现聊天室功能Jun 22, 2023 pm 10:58 PM

现在,随着互联网的普及,实时通讯已经成为了人们日常生活中不可或缺的一部分,而聊天室作为一种集体交流的方式,也越来越被大家所接受和使用。本文将介绍如何使用PHP实现一个简单的聊天室功能。确定需求在开始编写程序之前,我们需要先明确自己的需求。一个简单的聊天室需要具备以下的基本功能:用户可以注册、登录和退出;用户可以查看历史聊天记录;用户可以发送消息,并在页面上即

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前By尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
1 个月前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
1 个月前By尊渡假赌尊渡假赌尊渡假赌

热工具

Dreamweaver Mac版

Dreamweaver Mac版

视觉化网页开发工具

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器

WebStorm Mac版

WebStorm Mac版

好用的JavaScript开发工具

VSCode Windows 64位 下载

VSCode Windows 64位 下载

微软推出的免费、功能强大的一款IDE编辑器

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器