Yii2 connects to the websocket service to realize that the server actively pushes messages to the client

The previous article was about websocket services, this article is about calling services and web-side calls, and receiving messages

 1. Call the websocket service and actively push the message method

<?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. Add writing tasks to the 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. Push messages to join the asynchronous queue:

<?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());
        }
    }

}

 Manual push message task queue test command:

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

4. The web end connects to the websocket service to receive messages

<!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. Configure 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

Guess you like

Origin blog.csdn.net/hechenhongbo/article/details/125390009