PHP开发PHP经验分享

think-swoole v3.1 socket.io 自定义事

2021-02-21  本文已影响0人  HyperLifelll9

think-swoole v3.1 更新中,改进了 socket.io 事件的触发方式,之前注册的自定义的 socket.io 事件监听配置将全部失效。

翻阅源码(think\swoole\websocket\socketio\Handler.php)后可以发现:
对于自定义的 socket.io 事件,新版的 think-swoole 将不会帮我们自动触发,而是将这些自定义事件的相关数据集中发射到了 swoole.websocket.Event 事件中:

case Packet::EVENT:
    [$type, $data] = $packet->data;
    result = $this->event->trigger('swoole.websocket.Event', ['type' => $type, 'data' => $data]);

    if ($packet->id !== null) {
        $responsePacket = Packet::create(Packet::ACK, [
            'id'   => $packet->id,
            'nsp'  => $packet->nsp,
            'data' => $result,
        ]);

        $this->push($responsePacket);
     }
    break;

其中 $type 为事件名,$data 为该事件所携带的数据。
知道原因后,我们可以自己动手实现一个 socket.io 自定义事件分发器,自行触发自定义的 socket.io 事件:

  1. 编写一个事件监听器:
<?php

declare(strict_types=1);

namespace app\listener\websocket;

use app\core\Result;
use think\facade\Event;
use think\helper\Str;

class SocketEventDispatcher
{

    /**
     * 事件监听处理
     *
     * @return mixed
     */
    public function handle($event)
    {
        ['type' => $type, 'data' => $data] = $event;
        // 自行触发事件
        // 为了防止事件名冲突,添加 swoole.websocket.Event. 前缀
        Event::trigger('swoole.websocket.Event.' . Str::studly($type),  $data);
    }
}

2.1. 注册事件监听器(方式一:event.php):

...
'swoole.websocket.Event'             => [SocketEventDispatcher::class],
'swoole.websocket.Event.CustomEvent' => [CustomEvent::class],
...

2.2. 注册事件监听器(方式二:config/swoole.php):

...
'listen'  => [
    'Event'             => SocketEventDispatcher::class,
    'Event.CustomEvent' => CustomEvent::class,
]
...
上一篇下一篇

猜你喜欢

热点阅读