page contents

tp6中swoole扩展websocket的使用

相信不少人都已经知道tp6.0已经适配swoole.并推出think-swoole 3.0 ,这次就来介绍下tp6中swoole扩展websocket的使用。

attachments-2020-06-tDHgkAjn5ef050f632ee5.png


相信不少人都已经知道tp6.0已经适配swoole.并推出think-swoole 3.0 ,这次就来介绍下tp6中swoole扩展websocket的使用。

Websocket 继承与Http,进行websocket连接之前需要一次HTTP请求,如果当期地址支持websocket则返回101,然后进行连接。也就是说并不是服务支持websocket后,请求每个连接地址都可以进行websocket连接,而是需要预先适配才可以连接。

thinkphp6.0中新增的一项就是Event,websocket服务这块依赖于Event,因此我们需要先创建一个Event listener

php think make:listener WebsocketTest

执行过后,将会在app目录下看到新增的目录和文件

v2-b662c63a4a48f38bcce35185eacf7d28_720w.jpg


其中handle是用来处理事件。

参考如图进行修改

class WebsocketTest
{
    public $websocket = null;
    /**
    * 注入容器管理类,从容器中取出Websocket类,或者也可以直接注入Websocket类,
    */
    public function __construct(Container $container)
    {
        $this->websocket = $container->make(Websocket::class);
    }

    /**
     * 事件监听处理
     *
     * @return mixed
     */
    public function handle($event)
    {
        //回复客户端消息
        $this->websocket->emit("testcallback", ['aaaaa' => 1, 'getdata' => $event['asd']]);
        //不同于HTTP模式,这里可以进行多次发送
           $this->websocket->emit("testcallback", ['aaaaa' => 1, 'getdata' => $event['asd']]);
    }
}


Websocket和事件是如何关联的呢?

打开config目录找到swoole.php,修改其中配置信息

'websocket'  => [
        'enable'        => true,
        'handler'       => Handler::class,
        'parser'        => Parser::class,
        'ping_interval' => 25000,
        'ping_timeout'  => 60000,
        'room'          => [
            'type'  => 'table',
            'table' => [
                'room_rows'   => 4096,
                'room_size'   => 2048,
                'client_rows' => 8192,
                'client_size' => 2048,
            ],
            'redis' => [

            ],
        ],
        'listen'        => [
            'test' => \app\listener\WebsocketTest::class,  //这里将事件名称和事件处理类进行注册
        ],
        'subscribe'     => [],
    ],
    'rpc'        => [
        'server' => [
            'enable'   => false,
            'port'     => 9000,
            'services' => [
            ],
        ],
        'client' => [
        ],
    ],

接下来就是见证奇迹的时刻,启动服务,打开http://127.0.0.1:8882/demo.html 并打开控制台,执行如下代码,就可以看到页面打印出服务器反馈的信息


注意发送的数据内容格式,demo中存在字段asd

socket.emit("test",{"asd":"我是内容"})

v2-9b4238c772751484cc2b5d3ee699ecae_720w.jpg


attachments-2020-06-FKYgZzGW5ef0512852c98.jpg

  • 发表于 2020-06-22 14:35
  • 阅读 ( 778 )
  • 分类:PHP开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

1135 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1316 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章