通过 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) {
//给订阅用户推送数据
});
前端是使用 SockJS
和 Stomp
来订阅?