Home PHP Framework ThinkPHP thinkphp 6.0 swoole extension websocket usage tutorial

thinkphp 6.0 swoole extension websocket usage tutorial

Jun 29, 2019 pm 05:38 PM

thinkphp 6.0 swoole extension websocket usage tutorial

Preface

ThinkPHP is about to usher in the latest version 6.0. In response to the increasingly popular Swoole, thinkphp has also launched the latest extension think- swoole 3.0.

Introduction

The upcoming tp6.0 has been adapted to swoole. And think-swoole 3.0 has been launched, and is adapted to socketio by default. The usage method is slightly different from version 2.0.

Websocket inherits from Http. An HTTP request is required before connecting to websocket. If the current address supports websocket, 101 will be returned, and then the connection will be made. In other words, it is not that after my service supports websocket, every connection address requested can be connected to the websocket, but it needs to be pre-adapted before it can be connected.

Parameter configuration

'server'           => [        'host'      => '0.0.0.0', // 监听地址
        'port'      => 808, // 监听端口
        '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'       => 4,//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,// 开启websocket
        'handler'       => Handler::class,  //自定义wbesocket绑定类
        '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'           => [],
Copy after login

handler and parser greatly facilitate custom websocket services, and the default system integrates socketio.

This article mainly introduces how to use socketio. It is assumed that everyone has a certain understanding and usage foundation of socketio.

socketIo will add corresponding parameters after the request address by default

thinkphp 6.0 swoole extension websocket usage tutorial

At the same time, socketio will think http://url/socket.io by default / is the address that supports websocket services.

thinkphp 6.0 swoole extension websocket usage tutorial

The address request has been processed internally in tp-swoole3.0

<?phpnamespace  think\swoole\websocket\socketio;use think\Config;use think\Cookie;use think\Request;class Controller{    protected $transports = [&#39;polling&#39;, &#39;websocket&#39;];    public function upgrade(Request $request, Config $config, Cookie $cookie)
    {        if (!in_array($request->param('transport'), $this->transports)) {            return json(
                [                    'code'    => 0,                    'message' => 'Transport unknown',
                ],                400
            );
        }        if ($request->has('sid')) {
            $response = response('1:6');
        } else {
            $sid     = base64_encode(uniqid());
            $payload = json_encode(
                [                    'sid'          => $sid,                    'upgrades'     => ['websocket'],                    'pingInterval' => $config->get('swoole.websocket.ping_interval'),                    'pingTimeout'  => $config->get('swoole.websocket.ping_timeout'),
                ]
            );
            $cookie->set('io', $sid);
            $response = response('97:0' . $payload . '2:40');
        }        return $response->contentType('text/plain');
    }    public function reject(Request $request)
    {        return json(
            [                'code'    => 3,                'message' => 'Bad request',
            ],            400
        );
    }
}
Copy after login

TP6.0, the plug-in registration is carried out in service mode To register, you can view the route registration information in the tp-swoole service registration file. If you want to customize the link rules, you can override the route.

<?php // +----------------------------------------------------------------------// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]// +----------------------------------------------------------------------// | Copyright (c) 2006-2018 http://thinkphp.cn All rights reserved.// +----------------------------------------------------------------------// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )// +----------------------------------------------------------------------// | Author: yunwuxin <448901948@qq.com>// +----------------------------------------------------------------------namespace think\swoole;use Swoole\Http\Server as HttpServer;use Swoole\Websocket\Server as WebsocketServer;use think\App;use think\Route;use think\swoole\command\Server as ServerCommand;use think\swoole\facade\Server;use think\swoole\websocket\socketio\Controller;use think\swoole\websocket\socketio\Middleware;class Service extends \think\Service{    protected $isWebsocket = false;    /**
     * @var HttpServer | WebsocketServer
     */
    protected static $server;    public function register()
    {        $this->isWebsocket = $this->app->config->get('swoole.websocket.enabled', false);        $this->app->bind(Server::class, function () {            if (is_null(static::$server)) {                $this->createSwooleServer();
            }            return static::$server;
        });        $this->app->bind('swoole.server', Server::class);        $this->app->bind(Swoole::class, function (App $app) {            return new Swoole($app);
        });        $this->app->bind('swoole', Swoole::class);
    }    public function boot(Route $route)
    {        $this->commands(ServerCommand::class);        if ($this->isWebsocket) {
            $route->group(function () use ($route) {
                $route->get('socket.io/', '@upgrade');
                $route->post('socket.io/', '@reject');
            })->prefix(Controller::class)->middleware(Middleware::class);
        }
    }    /**
     * Create swoole server.
     */
    protected function createSwooleServer()
    {
        $server     = $this->isWebsocket ? WebsocketServer::class : HttpServer::class;
        $config     = $this->app->config;
        $host       = $config->get('swoole.server.host');
        $port       = $config->get('swoole.server.port');
        $socketType = $config->get('swoole.server.socket_type', SWOOLE_SOCK_TCP);
        $mode       = $config->get('swoole.server.mode', SWOOLE_PROCESS);        static::$server = new $server($host, $port, $mode, $socketType);
        $options = $config->get('swoole.server.options');        static::$server->set($options);
    }
}
Copy after login

Socketio uses demo by default

nbsp;html>
    <meta>
    <title>Title</title>
    <script></script><script>
    const socket = io(&#39;http://localhost:808&#39;);
    socket.emit("test", "your message");
    socket.on("test",function(res){console.log(res)});</script>
Copy after login

Websocket routing configuration method

Create a new websocket.php file in the app directory. Note that due to the use of reflection, closure parameters The name cannot be defined arbitrarily, otherwise it cannot be injected. The first parameter is websocket, which is the Server object of the current websocket, and the second parameter data is the data sent by the client. The first parameter of socketio emit is the same as the first parameter of Websocket::on, which is used as the event name.

<?php /**
 * Author:Xavier Yang
 * Date:2019/6/5
 * Email:499873958@qq.com
 */use \think\swoole\facade\Websocket;
Websocket::on("test", function (\think\swoole\Websocket $websocket, $data) {    //var_dump($class);
    $websocket->emit("test", "asd");
});
Websocket::on("test1", function ($websocket, $data) {
    $websocket->emit("test", "asd");
});
Websocket::on("join", function (\think\swoole\Websocket $websocket, $data) {
    $websocket->join("1");
});
Copy after login

thinkphp 6.0 swoole extension websocket usage tutorial

Refer to the above method to use the new websocket service. Of course, tp-swoole3.0 also has many other new features, which you need to explore and try.
I will also share my usage process with you in the next article.

For more ThinkPHP related technical articles, please visit the ThinkPHP usage tutorial column to learn!

The above is the detailed content of thinkphp 6.0 swoole extension websocket usage tutorial. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)