thinkphp6 swoole websocket长连接使用

安装swoole扩展

composer require topthink/think-swoole

配置swoole 文件位置 config/swoole.php

<?php

use thinkswoolewebsocketsocketioHandler;
use thinkswoolewebsocketsocketioParser;

return [
    server     => [
        host      => env(SWOOLE_HOST, 127.0.0.1), // 监听地址
        port      => env(SWOOLE_PORT, 80), // 监听端口
        mode      => SWOOLE_PROCESS, // 运行模式 默认为SWOOLE_PROCESS
        sock_type => SWOOLE_SOCK_TCP, // sock type 默认为SWOOLE_SOCK_TCP
        options   => [
            pid_file              => runtime_path() . swoole.pid,
            log_file              => runtime_path() . swoole.log,
            daemonize             => true,//长连接必须开启保护模式
            // Normally this value should be 1~4 times larger according to your cpu cores.
            reactor_num           => swoole_cpu_num(),
            worker_num            => swoole_cpu_num(),
            task_worker_num       => swoole_cpu_num(),
            enable_static_handler => true,
            document_root         => root_path(public),
            package_max_length    => 40 * 1024 * 1024,
            buffer_output_size    => 20 * 1024 * 1024,
            socket_buffer_size    => 256 * 1024 * 1024,
            user                  => nobody
        ],
    ],
    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 => [
                host          => 127.0.0.1,
                port          => 6379,
                max_active    => 5,
                max_wait_time => 5,
            ],
        ],
        listen        => [],
        subscribe     => [],
    ],
    rpc        => [
        server => [
            enable   => false,
            port     => 9000,
            services => [
            ],
        ],
        client => [
        ],
    ],
    hot_update => [
        enable  => true,
        name    => [*.php],
        include => [app_path()],
        exclude => [],
    ],
    //连接池
    pool       => [
        db    => [
            enable        => true,
            max_active    => 3,
            max_wait_time => 5,
        ],
        cache => [
            enable        => true,
            max_active    => 3,
            max_wait_time => 5,
        ],
        //自定义连接池
    ],
    coroutine  => [
        enable => true,
        flags  => SWOOLE_HOOK_ALL,
    ],
    tables     => [],
    //每个worker里需要预加载以共用的实例
    concretes  => [],
    //重置器
    resetters  => [],
    //每次请求前需要清空的实例
    instances  => [],
    //每次请求前需要重新执行的服务
    services   => [],
];

监听事件 文件位置 app/event.php

<?php
// 事件定义文件
return [
    bind      => [
    ],

    listen    => [
        AppInit  => [],
        HttpRun  => [],
        HttpEnd  => [],
        LogLevel => [],
        LogWrite => [],
        swoole.webtsocket.Close       => [
            applistenerWsClose::class
        ],
        swoole.webtsocket.Connect       => [
            applistenerWsConnect::class
        ],
        swoole.webtsocket.Test       => [
           applistenerWsTest::class,
        ],
    ],

    subscribe => [
    ],
];

创建监听文件

php think make:listener WsTest

文件生成位置 app/listener/WsTask.php

<?php
declare (strict_types = 1);

namespace applistener;

class WsTest
{
          
   
    public function handle($event)
    {
          
   
    	//发送消息
    	 $ws->emit(callback,$list);
    	 return;
    }
}
经验分享 程序员 微信小程序 职场和发展