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
Gleichzeitig denkt Socketio an http://url/socket.io vorbei Standard / ist die Adresse, die WebSocket-Dienste unterstützt.
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 = ['polling', 'websocket']; 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('http://localhost:808'); 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"); });
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!