Heim PHP-Framework Denken Sie an PHP Tutorial zur WebSocket-Nutzung der Thinkphp 6.0-Swoole-Erweiterung

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

Jun 29, 2019 pm 05:38 PM

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'           => [],
Nach dem Login kopieren

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
        );
    }
}
Nach dem Login kopieren

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);
    }
}
Nach dem Login kopieren

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>
Nach dem Login kopieren

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");
});
Nach dem Login kopieren

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!

Erklärung dieser Website
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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)