【已解决】请教用 webman/push 推送K线

南宫春水

问题描述

通过 AsyncTcpConnection向第三方服务订阅了K线数据存在缓存中。能用webman/push给客户端推送数据吗?如果能用的话,那么文档里面下面一段代码应该写在哪里合适?

use Webman\Push\Api;
$api = new Api(
    // webman下可以直接使用config获取配置,非webman环境需要手动写入相应配置
    'http://127.0.0.1:3232',
    config('plugin.webman.push.app.app_key'),
    config('plugin.webman.push.app.app_secret')
);
// 给订阅 user-1 的所有客户端推送 message 事件的消息
$api->trigger('user-1', 'message', [
    'from_uid' => 2,
    'content'  => '你好,这个是消息内容'
]);

客户端


<script lang="ts" setup>
import {  onMounted } from 'vue'
import { Push } from '../utils/push-vue'

onMounted(() => {
  console.log('组件已经挂载') 

  //实例化webman-push

  // 建立连接
  var connection = new Push({
    url: 'ws://127.0.0.1:3131', // websocket地址
    app_key: '<app_key,在config/plugin/webman/push/app.php里获取>',
    auth: '/plugin/webman/push/auth' // 订阅鉴权(仅限于私有频道)
  });

  // 浏览器监听user-1频道的消息,也就是用户uid为1的用户消息
  var kline_channel = connection.subscribe('kline_1m');

  // 当user-1频道有message事件的消息时
  kline_channel.on('message', function (data) {
    // data里是消息内容
    console.log(data);
  });

})

</script>

如果 webman/push 不适用的话,是使用自定义websocket监听例子?

<?php
namespace app;

use Workerman\Connection\TcpConnection;

class Pusher
{
    // 存储客户端的订阅信息
    private array $clients = [];

    public function onConnect(TcpConnection $connection)
    {
        echo "onConnect\n";
    }

    public function onWebSocketConnect(TcpConnection $connection, $http_buffer)
    {
        echo "onWebSocketConnect\n";
    }

    public function onMessage(TcpConnection $connection, $data)
    {
         $this->handleMessage($connection, $data);
    }

    public function onClose(TcpConnection $connection)
    {
        echo "onClose\n";
    }

     private function handleMessage(TcpConnection $connection, $data)
    {
        $message = json_decode($data, true);
        if (isset($message['action']) && $message['action'] === 'subscribe') {
            $symbol = $message['symbol'] ?? null;
            if ($symbol) {
                // 存储客户端的订阅信息
                $this->clients[$connection->id] = $symbol;
                echo "Client {$connection->id} subscribed to $symbol\n";
            }
        } elseif (isset($message['action']) && $message['action'] === 'unsubscribe') {
            // 移除订阅
            unset($this->clients[$connection->id]);
            echo "Client {$connection->id} unsubscribed\n";
        }
    }

}

如上ws服务,应该怎么每秒推送一次

// 定时器每1秒发送一次更新
\Workerman\Timer::add(1, function() use ($server) {
    //给订阅用户推送数据
});

前端是使用 SockJSStomp来订阅?

118 0 0
0个回答

×
🔝