TP3.1.2整合GatewayWorker

2018-11-08  本文已影响0人  dswjcms

测试所用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('/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('/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';
上一篇下一篇

猜你喜欢

热点阅读