tp6 think-swoole3.0

浏览:828 发布日期:2019/08/09 分类:功能实现 关键字: tp6 swoole
tp6 swoole 中 websocket的应用
tp6默认是支持socketio的。
但我个人每少使用socketio。以前一直用websocket. 升级到tp6后突然发现自己不会用think-swoole了。也找不到文档。
今天自己看了下源码 整理了一个入门的东西。分享给大家。
先上配置文件<?php

use think\swoole\websocket\room\TableRoom;
use app\server\Parser;
use app\server\Handler;

return [
    'server'           => [
        'host'      => '0.0.0.0', // 监听地址
        'port'      => 9501, // 监听端口
        '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'             => false,
            // 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'    => 20 * 1024 * 1024,
            'buffer_output_size'    => 10 * 1024 * 1024,
            'socket_buffer_size'    => 128 * 1024 * 1024,
            'max_request'           => 3000,
            'send_yield'            => true,
        ],
    ],
    'websocket'        => [
        'enabled'       => true,
        'handler'       => Handler::class,
        'parser'        => Parser::class,
        'route_file'    => base_path() . 'websocket.php',
        'ping_interval' => 25000,
        'ping_timeout'  => 60000,
        'room'          => [
            'type'        => TableRoom::class,
            'room_rows'   => 4096,
            'room_size'   => 2048,
            'client_rows' => 8192,
            'client_size' => 2048,
        ],
    ],
    'auto_reload'      => true,
    'enable_coroutine' => true,
    'resetters'        => [],
    'tables'           => [],
];
重点在websocket这块的配置。
1 enabled=>true 启用websocket
2 handler parser 两个配置类。这里默认是使用socketio的。重写这两个类。
上代码 啥也不多说了<?php
namespace app\server;
use think\App;
use Swoole\WebSocket\Server as WebsocketServer;
use think\Config;
use think\Request;
use Swoole\Websocket\Frame;
use think\swoole\facade\Server;
use think\swoole\websocket\HandlerContract;
class Handler implements HandlerContract{
    /** @var WebsocketServer */
    protected $server;
    /** @var Config */
    protected $config;
    public function __construct(App $app)
    {
        $this->server = $app->make(Server::class);
        $this->config = $app->config;
    }
    public function onOpen($fd,Request $request){
        //有用户登录时....
        return true;
    }
    /**
     * 这里是正常影响客户的send的消息
     *
     * @param Frame $frame
     * @return void
     * @author  autumu
     */
    public function onMessage(Frame $frame){        
        //p($frame);
        $this->server->push($frame->fd,123213123);
        return ;
    }
    public function onClose($fd, $reactorId)
    {
        p("{$fd}离开了");
        return ;
    }
}
<?php
namespace app\server;
use Swoole\WebSocket\Frame;
use Swoole\WebSocket\Server;
use think\facade\App;
class Parser extends \think\swoole\websocket\Parser{
    /**
     * @return boolean
     */
    public function execute($server, $frame){
        //这里可以做数据过滤 心跳包之类的  true代表结束后续流程
        //例如 检测到前端发来的是ping包,这里就可以直接给客户端返回pong 不需要进入后面的流程了
        return false;
    }
    /**
     * 目前还不知道在websocket中有什么用
     *
     * @param string $event
     * @param [type] $data
     * @return void
     * @author  autumu
     */
    public function encode(string $event, $data)
    {
        //echo "encode";
    }
    // 客户端传递消息格式
    // {"event":"login","data":{"user":"admin","pwd":"1234"}}
    // think\swoole\concerns\InteractsWithWebsocket  中onMessage要使用过,除非自己去修改里面的逻辑
    public function decode($frame)
    {
        $data = json_decode($frame->data,true);
        return $data;
    }
}
注 : 目前是有规定客户传递数据的格式的。不像以前,自己随便写
评论( 相关
后面还有条评论,点击查看>>