TP5 集成 WorkerMan 以及 GatewayWorker 做实时聊天

一. 基础

1. workerman

workerman是国人开发的良心高性能的PHP socket 服务器框架,在全球最大同性交友平台gayHub的star都4K多,可以想象是多么的牛X。

可以单独部署,也可以整合进MVC的框架(TP,laravel等),可以说非常实用,并发效果也好。

官网地址:

gayhub地址:

2. gateway-worker

gateway-worker(后面直接称gateway)是基于 workerman开发的TCP长连接框架,用于快速开发TCP长连接应用。

在线聊天一般都是实用长连接保持通信,使用 workerman虽然能够做到同样的效果,但是gateway更加的方便快捷。

(轮询构建的聊天室已经OUT了,实在是太...)

gayhub地址:

3. gatewayClient

gateClient是用来辅助 workerman或者是gateway进行用户分组以及向用户发送信息的组件,同时,能够快速便捷的将原有系统的uid和clientid绑定起来。

gayhub地址:

二. 安装类库

1. workerman

  • linux
composer require topthink/think-worker
  • WINDOWS
composer require workerman/workerman-for-win

如果用的是TP5.0.X 安装的时候可能不成功,因为composer默认安装的最新版,也就是workerm的2.0.X版,所以需要

composer require topthink/think-worker v1.0.1

加上对应的版本号

2. gateway-worker

  • linux
composer require gateway-worker
  • WINDOWS
composer require gateway-worker-for-win

3. gatewayClient

composer require workerman/gatewayclient

三. 集成

  • workerman

主要做信息推送

TP5相关文档:https://www.kancloud.cn/manual/thinkphp5/235128
具体操作

  1. 在项目根目录新建server.php文件,文件内容为:
<?php
define('APP_PATH', __DIR__ . '/application/');
define('BIND_MODULE','push/Worker');
// 加载框架引导文件
require __DIR__ . '/thinkphp/start.php';

2.在项目下的application里新建push文件夹
3.在新建的push文件夹下面新建controller文件夹,目录结构为\application\push\controller
4.在刚才的controller文件夹下面新建Worker.php文件,内容为:

<?php

namespace app\push\controller;

use think\worker\Server;

class Worker extends Server
{
    protected $socket = 'websocket://0.0.0.0:2346';

    /**
     * 收到信息
     * @param $connection
     * @param $data
     */
    public function onMessage($connection, $data)
    {
        $connection->send('我收到你的信息了');
    }

    /**
     * 当连接建立时触发的回调函数
     * @param $connection
     */
    public function onConnect($connection)
    {
        $connection->send('正在连接');
    }

    /**
     * 当连接断开时触发的回调函数
     * @param $connection
     */
    public function onClose($connection)
    {
        $connection->send('连接关闭');
        $connection->close();
    }

    /**
     * 当客户端的连接上发生错误时触发
     * @param $connection
     * @param $code
     * @param $msg
     */
    public function onError($connection, $code, $msg)
    {
        echo "error $code $msg\n";
    }

    /**
     * 每个进程启动
     * @param $worker
     */
    public function onWorkerStart($worker)
    {

    }
}

5.上面都弄好后,就可以到项目目录里,启动监听服务

php server.php

6.运行成功后会出现类型于下图,如果报错可能是防火墙或端口没开放等,具体问题具体分析


image

7.客户端可以连接方式

ws = new WebSocket("ws://127.0.0.1:2346");
ws.onopen = function() {
   alert("连接成功");
   ws.send('tom');
   alert("给服务端发送一个字符串:tom");
};
ws.onmessage = function(e) {
   alert("收到服务端的消息:" + e.data);
};
  • gateway-worker

主要做单聊,群聊和广播

由于通过composer安装时只下载了核心类,我们可以下载一些demo来进行配置

  1. 去官网下载Windows版的gateway-worker,里面有demo。http://www.workerman.net/download
  2. 将下载的压缩包解压,将Applications/Yourapp中的文件全部复制到thinkphp5目录application/push里面
  3. 将解压后的文件夹中的start_for_win.bat复制到thinkphp5的根目录,即与application同级的目录
  4. 右键start_for_win.bat,点编辑,将里面的目录改成自己的目录,这里改为
php application\push\start_register.php application\push\start_gateway.php application\push\start_businessworker.php
Pause
  1. 保存退出。双击运行。
  2. linux基本一至,但不用编辑start_for_win.bat文件,直接使用start.php文件
  3. 成功运行后会出现如下图


    image

via:https://blog.csdn.net/qq_14913213/article/details/77184074

客户端连接成功后可以通过TP的MVC模式进行发送信息

<?php
namespace app\index\controller;

use \GatewayClient\Gateway;

class Index
{   
    public function send(){
        //绑定端口
        Gateway::$registerAddress = '127.0.0.1:1238';
        // 监查客户端是否在线
        Gateway::isOnline('7f0000010b5400000002')
        // 给所有客户端广播信息
        Gateway::sendToAll("test\r\n");
    }
}

更多操作方法可以查看

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,904评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,581评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,527评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,463评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,546评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,572评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,582评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,330评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,776评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,087评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,257评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,923评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,571评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,192评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,436评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,145评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,647评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,997评论 25 707
  • 幸福=资产-支出-负债。 受苦,其实是在清除幸福的负债。很多人不愿意受苦。受点苦头就抱怨命运的不公、生活的不幸,由...
    afe887dcd382阅读 1,501评论 1 12
  • 很久没有写点什么,偶尔灵感突现,心中纵有千言万语却难于表述。从今日起,可每日写个几百字,不拘格式,不拘文体,不拘内...
    取名不好取阅读 157评论 0 0
  • 每个人心底,都潜藏着一种害怕被时代抛弃,害怕在日出月落中就悄无声息变成穷人的恐惧」。这种恐惧会让他们最终屈从于大众...
    卖萌的叶子阅读 136评论 0 0