まえがき
ThinkPHP は間もなく最新バージョン 6.0 をリリースします。ますます人気が高まる Swoole に応えて、thinkphp も最新バージョン 6.0 をリリースします。拡張子 think-swoole 3.0。
はじめに
次期 tp6.0 は swoole に適応され、think-swoole 3.0 がリリースされ、デフォルトで socketio に適応されます。バージョン2.0とは使用方法が若干異なります。
Websocket は Http を継承します。WebSocket に接続する前に HTTP リクエストが必要です。現在のアドレスが WebSocket をサポートしている場合は、101 が返され、接続が確立されます。言い換えれば、サービスが WebSocket をサポートした後、要求されたすべての接続アドレスが WebSocket に接続できるわけではありませんが、接続する前に事前に適応させる必要があります。
パラメータ設定
'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' => [],
ハンドラーとパーサーはカスタム WebSocket サービスを大幅に容易にし、デフォルトのシステムには Socketio が統合されています。
この記事では、socketio の使い方を中心に紹介しますので、皆さんが soketio について一定の理解と使い方の基礎を持っていることを前提としています。
socketIo は、デフォルトでリクエスト アドレスの後に対応するパラメータを追加します。
同時に、socketio は http://url/socket.io を次のように認識します。デフォルトの / は、WebSocket サービスをサポートするアドレスです。
アドレス要求は 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 で内部処理され、プラグインの登録はサービス モードで実行されます。登録するには、tp-swoole サービス登録ファイル内のルート登録情報を表示できます。リンク ルールをカスタマイズする場合は、ルートを上書きできます。
<?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 はデフォルトでデモを使用します
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 ルーティング設定方法
アプリ ディレクトリに新しい websocket.php ファイルを作成します。リフレクションを使用しているため、クロージャパラメータ 名前を任意に定義することはできません。それ以外の場合は、名前を注入できません。最初のパラメータは websocket (現在の Websocket の Server オブジェクト) で、2 番目のパラメータ data はクライアントによって送信されたデータです。 Socketio Emit の最初のパラメータは、イベント名として使用される Websocket::on の最初のパラメータと同じです。
<?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"); });
新しい WebSocket サービスを使用するには、上記の方法を参照してください。もちろん、tp-swoole3.0 には他にも多くの新機能があるので、試してみる必要があります。
次の記事では私の使用プロセスも紹介します。
その他の ThinkPHP 関連の技術記事については、ThinkPHP 使用法チュートリアル 列にアクセスして学習してください。
以上がthinkphp 6.0 swoole 拡張機能 Websocket の使用方法のチュートリアルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

ZendStudio 13.5.1 Mac
強力な PHP 統合開発環境

メモ帳++7.3.1
使いやすく無料のコードエディター

mPDF
mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

EditPlus 中国語クラック版
サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

ドリームウィーバー CS6
ビジュアル Web 開発ツール
