美文网首页
thinkphp整合使用Workerman(web-msg-se

thinkphp整合使用Workerman(web-msg-se

作者: geeooooz | 来源:发表于2021-09-10 15:10 被阅读0次

    参考网址:

    ThinkPHP5.1 使用 web-msg-sender 实现WEB消息推送实例讲解
    https://blog.csdn.net/u011415782/article/details/100727827?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_title~default-1.no_search_link&spm=1001.2101.3001.4242
    

    https://github.com/walkor/web-msg-sender
    https://blog.csdn.net/h330531987/article/details/78081392
    https://www.myfuuun.com/post/20200151.html
    https://www.programminghunter.com/article/2055243073/
    https://www.workerman.net/download

    web-msg-sender简介: web-msg-sender是一款web长连接推送框架,采用PHPSocket.IO开发,基于WebSocket长连接通讯,如果浏览器不支持WebSocket则自动转用comet推送。 通过后台推送消息,消息可以即时推送到客户端,非轮询,实时性非常好,性能很高。

    环境
    PHP5.5.12
    thinkphp3.2.3

    安装/实现步骤
    以我的实际操作为例,简单过程如下:

    composer 后需要在入口文件增加require './vendor/autoload.php';

    1.安装 workenMan

    我是直接打开项目根目录 并在根目录中使用composer 安装 composer require workerman/workerman
    也可以参考:
    参考手册检查/安装workerman环境 】或者 【ThinkPHP5.1 安装 workerman 指导

    2.下载 web-msg-sender ,并解压缩到任意目录

    我是解压到了 ./vendor/

    官方 【web-msg-sender下载地址】或者【百度网盘备份 提取码:mz20 】,以我的操作为例,解压后的源码放在目录 "/vendor"

    image.png

    3.消息接收页面

     
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <div class="container">
            <fieldset class="layui-elem-field site-demo-button" style="margin-top: 30px;">
                <div>
                    <button type="button" class="layui-btn layui-btn-primary layui-btn-radius">我就是我,不一样的烟火!</button>
                    <br> <br> <button type="button" class="layui-btn layui-btn-normal layui-btn-radius btn-login-uid">百搭按钮</button>
                    <button type="button" class="layui-btn layui-btn-danger layui-btn-radius btn-msg-sender">HELLO</button>
                    <button type="button" id="online_box" class="layui-btn layui-btn-primary layui-btn-radius">我就是我,不一样的烟火!</button>
                </div>
            </fieldset>
        
        </div>
    </body>
    </html>
    <script src='https://cdn.bootcss.com/socket.io/2.0.3/socket.io.js'></script>
    <script src='//cdn.bootcss.com/jquery/1.11.3/jquery.js'></script>
    
    <script>
    $(document).ready(function () {
        console.log("start");
        // 使用时替换成真实的uid,这里方便演示随便写的
        var uid = '1';//可自定义
        // 连接服务端
        var socket = io('http://'+document.domain+':2120');//如果需要修改这个2120 则去 web-msg-sender文件下的start_io.php 搜索并修改 再次重启服务
        // 连接后登录
        socket.on('connect', function(){
            socket.emit('login', uid);
            $(".btn-login-uid").html("用户ID:"+uid);
            console.log("connect");
        });
        // 后端推送来消息时
        socket.on('new_msg', function(msg){
            //可以在这里自定义需要实现的业务
            $('.btn-msg-sender').html('收到消息:'+msg);
            console.log("connect");
        });
        // 后端推送来在线数据时
        socket.on('update_online_count', function(online_stat){
            console.log('online_stat:'+online_stat);
            $('#online_box').html(online_stat);
        }); 
    });
    </script>
    

    4.后台推送代码

    <?php
    namespace Demo\Controller;
    use Think\Controller;
    header('Content-Type:text/html;charset=utf-8');
    class WorkermanController extends Controller{
        
        /**
         * 展示页面
         */
        public function demo(){
            $this->display();
        }
        /**
         * 推送
         */
        public function push()
        {
            // 指明给谁推送,为空表示向所有在线用户推送
            $to_uid = '1';
            // 推送的url地址,上线时改成自己的服务器地址
            $push_api_url = "http://lhygtest.com:2121/";//2121不可变   lhygtest.com 对应你自己的
            $post_data = array(
               'type' => 'publish',
               'content' => '数据',//推送信息可自定义 如果是数组则需要转换为json数据
               'to' => $to_uid, 
            );
            $ch = curl_init ();
            curl_setopt ( $ch, CURLOPT_URL, $push_api_url );
            curl_setopt ( $ch, CURLOPT_POST, 1 );
            curl_setopt ( $ch, CURLOPT_HEADER, 0 );
            curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 );
            curl_setopt ( $ch, CURLOPT_POSTFIELDS, $post_data );
            curl_setopt ( $ch, CURLOPT_HTTPHEADER, array("Expect:"));
            $return = curl_exec ( $ch );
            curl_close ( $ch );
            var_export($return);
        
        }
        
    }
    

    5.运行web-msg-sender服务

    linux系统 cd 到到框架目录里运行: php start.php start -d;
    windows 系统进入到框架目录里双击 "start_for_win.bat" 文件启动
    
    image.png

    6.测试效果

    打开发送方页面、接收方页面,进行消息发送测试即可


    image.png image.png

    常见问题:
    如果通信不成功检查防火墙

    /sbin/iptables -I INPUT -p tcp --dport 2120 -j ACCEPT
    /sbin/iptables -I INPUT -p tcp --dport 2121 -j ACCEPT
    /sbin/iptables -I INPUT -p tcp --dport 2123 -j ACCEPT
    

    发现在linux中运行会报时区错误,所以要在这个文件中设置时区

    image.png
    image.png

    相关文章

      网友评论

          本文标题:thinkphp整合使用Workerman(web-msg-se

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