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

2021-09-10  本文已影响0人  geeooooz

参考网址:

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
上一篇下一篇

猜你喜欢

热点阅读