Heim  >  Artikel  >  PHP-Framework  >  thinkphp 6.0 swoole erweitert die Verwendung von WebSocket

thinkphp 6.0 swoole erweitert die Verwendung von WebSocket

藏色散人
藏色散人nach vorne
2020-12-15 09:35:532896Durchsuche

Die folgende Tutorial-Kolumne des thinkphp-Frameworks stellt Ihnen das Tutorial zur erweiterten Websocket-Nutzung von thinkphp 6.0 vor (think-swoole). Ich hoffe, es wird Freunden in Not hilfreich sein!

thinkphp 6.0 swoole erweitertes Websocket-Nutzungs-Tutorial (think-swoole)

Vorwort

Die in diesem Artikel bereitgestellte Methode kann nicht mehr verwendet werden. /github.com/xavieryang007 /think-swoole-demo/blob/master/doc/%E6%96%87%E6%A1%A3/4.1-websocket.md

Einführung

Das kommende tp6.0 war an swoole angepasst. Und think-swoole 3.0 wird gestartet und socketio ist standardmäßig angepasst. Die Verwendungsmethode unterscheidet sich geringfügig von Version 2.0.

Websocket erbt von Http. Vor der Verbindung mit Websocket ist eine HTTP-Anfrage erforderlich. Wenn die aktuelle Adresse Websocket unterstützt, wird 101 zurückgegeben und dann wird die Verbindung hergestellt. Mit anderen Worten: Nachdem mein Dienst WebSocket unterstützt, kann nicht jede angeforderte Verbindungsadresse mit WebSocket verbunden werden, sondern sie muss vorab angepasst werden, bevor eine Verbindung hergestellt werden kann.

Parameterkonfiguration

Wenn Sie Websocket verwenden möchten, müssen Sie es in der Konfiguration aktivieren, „Enable“ unter „Websocket“ auf „true“ setzen.

In diesem Artikel wird hauptsächlich die Verwendung von Socketio vorgestellt. Es wird davon ausgegangen, dass jeder über ein gewisses Verständnis und eine gewisse Nutzungsgrundlage für Socketio verfügt.

socketIo fügt standardmäßig entsprechende Parameter nach der Anforderungsadresse hinzu

thinkphp 6.0 swoole erweitert die Verwendung von WebSocketGleichzeitig betrachtet socketio standardmäßig http://url/socket.io/ als eine Adresse, die Websocket-Dienste unterstützt.

thinkphp 6.0 swoole erweitert die Verwendung von WebSocketUnd die Adressanfrage wurde intern in tp-swoole3.0

 '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'           => [],

TP6.0 verarbeitet, die Plug-in-Registrierung ist im Servicemodus registriert und die Routing-Registrierung kann im tp-swoole-Service eingesehen werden Informationen zur Registrierungsdatei. Sie können diese Route überschreiben, wenn Sie die Verknüpfungsregeln anpassen möchten.

<?php namespace 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
        );
    }
}

Socketio verwendet standardmäßig die Demo

<?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);
    }
}

Websocket-Routing-Konfigurationsmethode

Erstellen Sie eine neue websocket.php-Datei im App-Verzeichnis. Es ist zu beachten, dass der Name des Abschlussparameters aufgrund der Verwendung von Reflection nicht beliebig definiert werden kann. andernfalls kann es nicht injiziert werden. Der erste Parameter ist Websocket, das Serverobjekt des aktuellen Websockets, und die zweiten Parameterdaten sind die vom Client gesendeten Daten. Der erste Parameter von socketio emit ist derselbe wie der erste Parameter von Websocket::on, der als Ereignisname verwendet wird.

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>

thinkphp 6.0 swoole erweitert die Verwendung von WebSocketBeziehen Sie sich auf die oben beschriebene Methode, um den neuen Websocket-Dienst zu verwenden. Natürlich verfügt tp-swoole3.0 auch über viele weitere neue Funktionen, die Sie unbedingt erkunden und ausprobieren sollten.

Ich werde im nächsten Artikel auch meinen Nutzungsprozess mit Ihnen teilen.

Das obige ist der detaillierte Inhalt vonthinkphp 6.0 swoole erweitert die Verwendung von WebSocket. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen