yii2连接websocket服务实现服务端主动推送消息给客户端

2023-05-16

上一篇写的是websocket的服务,这一篇写写调用服务和web端调用,接收消息部分

 1、调用websocket服务,主动推送消息的方法

<?php
namespace \common\services;

use common\helpers\EnvHelper;
use WebSocket\BadOpcodeException;
use WebSocket\Client;
use yii\base\Exception;
use yii\console\Controller;

class WebSocketService extends Controller
{
    /**
     * Param: 通过user_id,推送消息
     * @return void
     * @throws Exception
     */
    public static function sendMsg($user_id,$price)
    {
        if(!empty($user_id)){
            $uri = 'wss://' . EnvHelper::get('WEBSOCKET_URL');
            $ws  = new Client($uri);
            try {
                $data = [
                    'user_id' =>$user_id,
                    'type'=>'WEBSOCKET_URL',
                    'msg' =>"您好,{$price}"
                ];
                $ws->send(json_encode($data,JSON_UNESCAPED_UNICODE));
                return "发送成功\n";
                usleep(100);
            } catch (BadOpcodeException $e) {
                throw new Exception($e->getMessage());
            }
            $ws->close();
        }
    }
}

2、在job中加入编写任务

<?php

namespace common\jobs;


/**
 * Param: 推送消息给
 * Class SendMsgJob
 */
class SendMsgJob extends \yii\base\BaseObject implements \yii\queue\JobInterface
{
    public $user_id;
    public $price;

    /**
     * @inheritdoc
     */
    public function execute($queue)
    {
        try {
            $res = WebSocketSendService::sendMsg($this->user_id,$this->price);
            \Yii::$app->byfLog->channel('WebSocket')->info('推送消息给:'.$res);
        }catch (\Exception $exception){
            \Yii::$app->byfLog->channel('WebSocket')->error('推送消息错误'.$exception->getFile() . ':' . $exception->getLine() . ':' . $exception->getMessage() . PHP_EOL);
        }
    }
}

 3、推送消息加入异步队列:

<?php
namespace console\controllers;

use addons\ByShop\common\exceptions\ShopException;
use common\services\WebSocketSendService;
use WebSocket\BadOpcodeException;
use yii\base\Exception;
use yii\console\Controller;

class WebSocketPushController extends Controller
{
    /**
     * Param: 通过user_id,推送消息给
     * @param $user_id
     * @return void
     * @throws Exception
     */
    public function actionSendMsg($user_id,$price)
    {
        try {
            WebSocketSendService::sendMsg($user_id,$price);
        } catch (BadOpcodeException $e) {
            throw new Exception($e->getMessage());
        }
    }

    /**
     * Param: 推送消息任务加入队列
     * @param $user_id
     * @param $price
     * @return void
     * @throws Exception
     */
    public function actionSendMsgJob($user_id,$price)
    {
        try {
            //$this->user_id,$this->price
            \Yii::$app->queue->bind('websocket-job')->push(new SendMsgJob(['user_id' => $user_id,'price'=>$price]));
        } catch (BadOpcodeException $e) {
            throw new Exception($e->getMessage());
        }
    }

}

 手动推送消息任务队列测试的命令:


php yii web-socket-push/send-msg-job 112402 4.9999  

4、web端连接websocket服务,实现接收消息

<!DOCTYPE HTML>
<html>
<head>
    <meta charset="utf-8">
    <title>websocket</title>
    <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
    <script type="text/javascript">

        //获取url中的参数
        function getUrlParam(name) {
            var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); //构造一个含有目标参数的正则表达式对象
            var r = window.location.search.substr(1).match(reg);  //匹配目标参数
            if (r != null) return unescape(r[2]); return null; //返回参数值
        }
        //使用方法, url中包含id这个参数
        var uid = getUrlParam("uid")

        if ("WebSocket" in window)
        {
            console.log('接收到的user_id='+user_id);
            //创建webSocket对象
            //var ws = new WebSocket("wss://test.***********.cn/wss?user_id="+user_id);  //测试
            //连接建立时触发
            ws.onopen = function()
            {
                console.log('已经建立连接');
            }

            //客户端接收服务端数据时触发
            ws.onmessage = function (evt)
            {
                var received_msg = evt.data;
                console.log('收到推送的消息:'+received_msg);
            }

            //连接关闭时触发
            ws.onclose = function(evt)
            {
                console.log("连接已关闭...");
            }

            //连接关闭时触发
            ws.onerror = function()
            {
                console.log("连接发生错误...");
            }
        }

        else
        {
            // 浏览器不支持 WebSocket
            alert("您的浏览器不支持 WebSocket!");
        }

        function sendData() {
            var msg = $("#msg").val();
            ws.send(msg);
        }
    </script>

</head>
<body>

<input type="text" placeholder="请输入要发送的文字" id="msg">

<button onclick="send_Data()">点击发送</button>

</body>
</html>

5、配置supervisor

[program:websocket-job]
command=php yii queue/listen websocket-job
directory=/data/test.*********.cn/
autorestart=true
startsecs=3
startretries=3
stdout_logfile=log/websocket-job.out.log
stderr_logfile=log/websocket-job.err.log
stdout_logfile_maxbytes=2MB
stderr_logfile_maxbytes=2MB
user=111111
priority=999
numprocs=1
process_name=%(program_name)s_%(process_num)02d

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

yii2连接websocket服务实现服务端主动推送消息给客户端 的相关文章

随机推荐

  • Linux(manjaro)微信web开发者工具

    安装 wine和winetricks span class hljs built in sudo span pacman S wine winetricks 打开winetricks 安装需要的组件 安装linux版本运行程序 github
  • C++类与对象

    C 43 43 面向对象 一 面向对象程序设计方法概述 1 凡是以类对象为基本构成单位的程序称为基于对象的程序 2 面向对象和面向过程的区别 xff1a 在笔者看来 xff0c 通俗地讲 xff0c 面向对象 就是在描述一个对象 xff0c
  • SVN无法提交修改问题

    分享一下我老师大神的人工智能教程 xff01 零基础 xff0c 通俗易懂 xff01 http blog csdn net jiangjunshow 也欢迎大家转载本篇文章 分享知识 xff0c 造福人民 xff0c 实现我们中华民族伟大
  • AbstractApplicationContext.refresh()应用上下文刷新方法

    前情提要 学习源码光看博客文章基本没有记住的可能 结合源码和博客 43 实践才能够通过理解记住 看了很多天才断断续续看完 发现它和其他IOC Bean生命周期都有关联 将之前片段式的认知串联起来了 这个刷新的代码很长 建议没耐心的时候就先不
  • IIC协议--简要理解

    1 iic协议是什么 xff1f IIC Inter xff0d Integrated Circuit 总线是一种由 PHILIPS 公司开发的两线式串行总线 xff0c 用于连接微控制器及其外围设备 它是由数据线 SDA 和时钟 SCL
  • RISC与CISC比较

    RISC的设计重点在于降低由硬件执行指令的复杂度 xff0c 因为软件比硬件容易提供更大的灵活性和更高的智能 xff0c 因此RISC设计对编译器有更高的要求 xff1b CISC的设计则更侧重于硬件执行指令的功能 xff0c 使CISC的
  • 操作系统选择调度方式和算法的若干准则

    1 调度的类型 按调度的层次 xff1a 长期 xff08 长程 作业 高级 xff09 调度 xff1b 中期 xff08 中级 中程 xff09 调度 xff1b 短期 xff08 短程 进程 低级 xff09 调度 按OS 的类型 x
  • 提灯过桥问题

    题目 xff1a 小明一家过一座桥 xff0c 过桥时是黑夜 xff0c 所以必须有灯 现在小明过桥要1秒 xff0c 小明的弟弟要3秒 xff0c 小明的爸爸要6秒 xff0c 小明的妈妈要8秒 xff0c 小明的爷爷要12秒 每次此桥最
  • 如何判断一个整数数组中是否有重复元素

    题目 xff1a 写一个函数判断一个int类型的数组是否是有效的 所谓有效是指 xff1a 假设数组大小为n xff0c 那么这个int数组里的值为0 n 1之间的数 xff0c 并且每个数只能出现一次 xff0c 否则就是无效数组 例如
  • 2014百度校招开发测试工程师笔试题

    时间 xff1a 2013 9 28 地点 xff1a 深圳 职位 xff1a 开发测试工程师
  • Spark Streaming + Spark SQL 实现配置化ETL流程

    Spark Streaming 非常适合ETL 但是其开发模块化程度不高 xff0c 所以这里提供了一套方案 xff0c 该方案提供了新的API用于开发Spark Streaming程序 xff0c 同时也实现了模块化 xff0c 配置化
  • 整体了解HADOOP框架及一些开源项目

    Hadoop框架中 xff0c 有很多优秀的工具 xff0c 帮助我们解决工作中的问题 Hadoop的位置 从上图可以看出 xff0c 越往右 xff0c 实时性越高 xff0c 越往上 xff0c 涉及到算法等越多 越往上 xff0c 越
  • Kafka简介

    Kafka简介 在当前的大数据时代 xff0c 第一个挑战是海量数据的收集 xff0c 另一个就是这些数据的分析 数据分析的类型通常有用户行为数据 应用性能跟踪数据 活动数据日志 事件消息等 消息发布机制用于连接各种应用并在它们之间路由消息
  • Flume入门笔记------架构以及应用介绍

    在具体介绍本文内容之前 xff0c 先给大家看一下Hadoop业务的整体开发流程 xff1a 从Hadoop的业务开发流程图中可以看出 xff0c 在大数据的业务处理过程中 xff0c 对于数据的采集是十分重要的一步 xff0c 也是不可避
  • 分布式服务框架dubbo原理解析

    alibaba有好几个分布式框架 xff0c 主要有 xff1a 进行远程调用 类似于RMI的这种远程调用 的 dubbo hsf xff0c jms消息服务 napoli notify xff0c KV数据库 tair 等 这个框架 工具
  • Android Studio Gradle project Sync Failed解决方法

    1 查看项目使用的gradle和本地gradle是否一致 本地gradle一般目录在C Users admin gradle文件夹下面 项目使用的gradle在项目的gradle wrapper properties文件中 distribu
  • Docker not running on windows 10 error: Hardware assisted virtualization and data execution protecti

    Docker not running on windows 10 error Hardware assisted virtualization and data execution protection must be enabled in
  • [高通SDM450][Android9.0]user版本uartlog常开

    文章目录 开发平台基本信息问题描述解决方法user版本调试串口可输入user版本uartlog常开 开发平台基本信息 芯片 SDM450 版本 Android 9 0 kernel msm 4 9 问题描述 user版本调试串口默认只输入调
  • Ubuntu 7.04 乱码解决

    一 解决XMMS乱码问题 菜单乱码的解决 1 sudo ln s etc gtk gtkrc zh CN etc gtk gtkrc zh CN utf 8 2 sudo gedit etc gtk gtkrc zh CN utf 8 填写
  • yii2连接websocket服务实现服务端主动推送消息给客户端

    上一篇写的是websocket的服务 xff0c 这一篇写写调用服务和web端调用 xff0c 接收消息部分 1 调用websocket服务 主动推送消息的方法 lt php namespace common services use co