美文网首页
TP3.1.2整合GatewayWorker

TP3.1.2整合GatewayWorker

作者: dswjcms | 来源:发表于2018-11-08 17:45 被阅读0次

    测试所用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';
    

    相关文章

      网友评论

          本文标题:TP3.1.2整合GatewayWorker

          本文链接:https://www.haomeiwen.com/subject/iaiwxqtx.html