Heim  >  Artikel  >  PHP-Framework  >  Tutorial zur WebSocket-Nutzung der Thinkphp 6.0-Swoole-Erweiterung

Tutorial zur WebSocket-Nutzung der Thinkphp 6.0-Swoole-Erweiterung

步履不停
步履不停Original
2019-06-29 17:38:395628Durchsuche

Tutorial zur WebSocket-Nutzung der Thinkphp 6.0-Swoole-Erweiterung

Vorwort

ThinkPHP steht kurz vor der Einführung der neuesten Version 6.0. Als Reaktion auf das immer beliebter werdende Swoole hat thinkphp auch die neueste Version herausgebracht Erweiterung think-swoole 3.0.

Einführung

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

Websocket erbt von HTTP. Vor der Websocket-Verbindung 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 dem Websocket verbunden werden, sondern sie muss vorab angepasst werden, bevor eine Verbindung hergestellt werden kann.

Parameterkonfiguration

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

Handler und Parser erleichtern benutzerdefinierte Websocket-Dienste erheblich, und das Standardsystem integriert Socketio.

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

Tutorial zur WebSocket-Nutzung der Thinkphp 6.0-Swoole-Erweiterung

Gleichzeitig denkt Socketio an http://url/socket.io vorbei Standard / ist die Adresse, die WebSocket-Dienste unterstützt.

Tutorial zur WebSocket-Nutzung der Thinkphp 6.0-Swoole-Erweiterung

Die Adressanfrage wurde intern 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
        );
    }
}

TP6.0 verarbeitet, die Plug-in-Registrierung erfolgt im Servicemodus To Wenn Sie sich registrieren, können Sie die Routenregistrierungsinformationen in der tp-swoole-Dienstregistrierungsdatei anzeigen. Wenn Sie die Linkregeln anpassen möchten, können Sie die Route überschreiben.

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

Socketio verwendet standardmäßig die Demo

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>

Websocket-Routing-Konfigurationsmethode

Erstellen Sie eine neue websocket.php-Datei im App-Verzeichnis. Beachten Sie, dass aufgrund der Verwendung von Reflection Abschlussparameter Der Name kann nicht beliebig definiert werden, da er sonst nicht injiziert werden kann. 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.

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

Tutorial zur WebSocket-Nutzung der Thinkphp 6.0-Swoole-Erweiterung

Beziehen 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.
Im nächsten Artikel werde ich auch meinen Nutzungsprozess mit Ihnen teilen.

Weitere technische Artikel zu ThinkPHP finden Sie in der Spalte Tutorial zur Verwendung von ThinkPHP.

Das obige ist der detaillierte Inhalt vonTutorial zur WebSocket-Nutzung der Thinkphp 6.0-Swoole-Erweiterung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn