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' => [],
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
At the same time, socketio will think http://url/socket.io by default / is the address that supports websocket services.
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 = ['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, 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); } }
Socketio uses demo by default
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 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"); });
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!