TP3.1.2整合GatewayWorker

测试所用PHP版本为5.4;参考GatewayWorker手册:http://doc2.workerman.net
百度中发现TP整合GatewayWorke的都是3.2或更高版本的,因为自己做的项目都是基于3.1.2的,所以记录下,用于以后项目搭建所用。
windows和linux的搭建访问都差不多,笔者因用windows的,所以为了方便就直接在windows开发,因服务器用的是linux,开发完后,最终还是需要整合到linux上的。
一、下载GatewayWorker官方demo,直接通过GatewayWorker手册的序言就能找到相应的demo下载
二、解压到任意位置
三、进入php安装目录(官方是运行start_for_win.bat直接启动的,但自己的电脑没有运行成功,可能因为某些配置没有配吧,反正懒的搞,就用cmd直接运行了)
四、打开"cmd"
五、运行如下代码

php D:\phpStudy\PHPTutorial\WWW\XXX\GatewayWorker\Applications\YourApp\start_register.php D:\phpStudy\PHPTutorial\WWW\XXX\GatewayWorker\Applications\YourApp\start_gateway.php D:\phpStudy\PHPTutorial\WWW\XXX\GatewayWorker\Applications\YourApp\start_businessworker.php

以上的D:\phpStudy\PHPTutorial\WWW\XXX是我放GatewayWorker的路径,这里你可以放到你的TP项目根目录即可
如果运行报错,请把php.exe的路径加到环境变量中
出现如下同,说明GatewayWorker已经运行


image.png

六、新开几个cmd命令行窗口运行 telnet 127.0.0.1 8282,输入任意字符即可聊天(非本机测试请将127.0.0.1替换成实际ip)。
七、开始整合tp项目(这里假设你的TP项目放在D:\phpStudy\PHPTutorial\WWW\XXX,并绑定了xp.xxx.cn为访问域名),整合原理可参考:http://doc2.workerman.net/326107
八、下载GatewayClient:https://github.com/walkor/GatewayClient
九、把解压后的GatewayClient目录放到Lib/Plugin目录下(我这里把GatewayClient放到了Lib/Plugin,你们可以放到其它目录,只要在后面调用的时候路径改成你们对应的路径即可);然后把Gateway.php改名为Gateway.class.php
十、修改GatewayWorker\Applications\YourApp\Events.php文件,只要修改onConnect方法即可,其它2个方法可以删除

public static function onConnect($client_id)
    {
        Gateway::sendToClient($client_id, json_encode(array(
            'type'      => 'init',
            'client_id' => $client_id
        )));
    }

十一、修改GatewayWorker\Applications\YourApp\start_gateway.php第24行,改成

$gateway = new Gateway("websocket://0.0.0.0:8282");

运行第五步方法,如果GatewayWorker刚才没有退出,请按ctrl+c退出,然后再运行
十二、写模板页index.html

<!-- 这是引用了jq文件,请修改为自己的jq存放路径 -->
<script src="__PUBLIC__/bootstrap/js/jquery-1.7.2.min.js"></script>

<ul>
</ul>
<label>发送给:<input id="uid" value="1" ></label>
<label>内容:<textarea id="nr"></textarea></label>
<button type="button" id="send" >发送</button>
<script type="text/javascript">
   /**
     * 与GatewayWorker建立websocket连接,域名和端口改为你实际的域名端口,
     * 其中端口为Gateway端口,即start_gateway.php指定的端口。
     * start_gateway.php 中需要指定websocket协议,像这样
     * $gateway = new Gateway(websocket://0.0.0.0:7272);
     */
    ws = new WebSocket("ws://"+document.domain+":8282");
    ws.onopen=function (ev) {
        console.log('上线');
    }
    ws.onerror=function(e){
        console.log(e);
    }
    ws.onclose=function(e){
        console.log('下线');
    }
    // 服务端主动推送消息时会触发这里的onmessage
    ws.onmessage = function(e){
        console.log(e.data);
        // json数据转换成js对象
        var data = eval("("+e.data+")"),uid='{$Think.get.uid}';
        var type = data.type || '';
        switch(type){
            // Events.php中返回的init类型的消息,将client_id发给后台进行uid绑定
            case 'init':
                // 利用jquery发起ajax请求,将client_id发给后端进行uid绑定
                $.post('__ROOT__/Index/bind', {uid:uid,group:1,client_id: data.client_id}, function(data){}, 'json');

                break;
            // 当mvc框架调用GatewayClient发消息时直接alert出来
            default :
                $('ul').append('<li>'+data.message+'</li>');
        }
    };
    $(function () {
        $('#send').click(function(){
            var nr=$('#nr').val(),uid=$('#uid').val();
            if(!nr){
                alert('请输入内容');
            }
            if(!uid){
                alert('发送对象不能为空');
            }
            $.post('__ROOT__/Index/message', {uid:uid,group:1,message: nr}, function(data){}, 'json');
            $('#nr').val('');
            //console.log(nr);
        })
    })
</script>

十三、修改控制文件IndexAction.class.php

<?php
use GatewayClient\Gateway;
defined('THINK_PATH') or exit();
class IndexAction extends HomeAction {
    public function index(){

        $this->display();
    }
    //绑定账号
    public function bind(){
        $client_id=I('client_id');
        //加载GatewayClient。关于GatewayClient参见本页面底部介绍
        //require_once '/your/path/GatewayClient/Gateway.php';
        import('@.Plugin.GatewayClient.Gateway');
        //$Gateway=new Gateway();
        //$gateway = new Gateway();
        // GatewayClient 3.0.0版本开始要使用命名空间
        // 设置GatewayWorker服务的Register服务ip和端口,请根据实际情况改成实际值(ip不能是0.0.0.0)
        Gateway::$registerAddress = '127.0.0.1:1238';

        // 假设用户已经登录,用户uid和群组id在session中
        $uid      = I('uid');
        $group_id = I('group');

        // client_id与uid绑定
        Gateway::bindUid($client_id, $uid);
        // 加入某个群组(可调用多次加入多个群组)
        Gateway::joinGroup($client_id, $group_id);
    }
    //接收信息
    public function message(){
        //加载GatewayClient。关于GatewayClient参见本页面底部介绍
        //require_once '/your/path/GatewayClient/Gateway.php';
        import('@.Plugin.GatewayClient.Gateway');
        // GatewayClient 3.0.0版本开始要使用命名空间
        // 设置GatewayWorker服务的Register服务ip和端口,请根据实际情况改成实际值(ip不能是0.0.0.0)
        Gateway::$registerAddress = '127.0.0.1:1238';

        $uid=I('uid');
        //$message=I('message');
        $message=json_encode(array(
            'message'=>I('message')
        ));
        $group=I('group');
        //给所有用户发
        //Gateway::sendToAll($message);
        // 向任意uid的网站页面发送数据
        Gateway::sendToUid($uid, $message);
        // 向任意群组的网站页面发送数据
        //Gateway::sendToGroup($group, $message);
    }
}

十四、用谷歌浏览器访问xp.XXX.cn/Index/index?uid=1,出现如下界面即为成功,如果console报错,就根据错误自行处理


image.png

十五、然后开2个浏览器,我一个用谷歌一个用火狐,只需要改变地址栏中的uid即可,如1、2
十六、测试,用谷歌浏览器输入内容为“你好自己”,然后页面会出现“你好自己”


image.png

十七、把发送给的1改为2,然后内容写上“你好2号”,再用火狐浏览器打开,就能看到“你好2号”
image.png

好了,你的GatewayWorker已整合到tp中了。
Linux整合说明
删除除Applications外的所有文件,然后把linux版本的vendor目录和start.php放上去
执行如下代码

php start.php start

修改/www/web/yiwo/public_html/GatewayWorker/Applications/YourApp/start_gateway.php文件

//找到$gateway = new Gateway("websocket://0.0.0.0:8282");
//然后把代码替换成以下代码
//设置WSS
// 证书最好是申请的证书
$context = array(
    // 更多ssl选项请参考手册 http://php.net/manual/zh/context.ssl.php
    'ssl' => array(
        // 请使用绝对路径
        'local_cert'                 => '/www/wdlinux/nginx/conf/cert/yiwo.dswjcms.com.pem', // 也可以是crt文件
        'local_pk'                   => '/www/wdlinux/nginx/conf/cert/yiwo.dswjcms.com.key',
        'verify_peer'               => false,
        // 'allow_self_signed' => true, //如果是自签名证书需要开启此选项
    )
);
// gateway 进程,这里使用Text协议,可以用telnet测试
$gateway = new Gateway("websocket://0.0.0.0:8282", $context);
// 开启SSL,websocket+SSL 即wss
$gateway->transport = 'ssl';
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容