현대 웹 애플리케이션의 지속적인 발전으로 실시간 커뮤니케이션은 꼭 필요한 기능 중 하나가 되었습니다. WebSocket 기술은 가장 널리 사용되는 실시간 통신 방법 중 하나로, 서버와 클라이언트 간에 지속적인 양방향 연결을 설정하여 실시간 통신을 달성할 수 있습니다.
ThinkPHP는 매우 인기 있는 PHP 프레임워크입니다. ThinkPHP 6은 Swoole 확장 패키지와 함께 제공되므로 WebSocket 기술을 매우 간단하게 사용할 수 있습니다. 이 기사에서는 ThinkPHP 6 프레임워크를 사용하여 WebSocket 브로드캐스트 기능을 구현하는 방법을 소개합니다.
시작하기 전에 다음 환경을 준비해야 합니다.
먼저 새 프로젝트:
composer create-project topthink/think my-project
그런 다음 WebSocket을 쉽게 사용하려면 프로젝트의 composer.json
파일에 Swoole 확장을 추가해야 합니다. composer.json
文件中添加 Swoole 扩展:
"require": { "topthink/think-swoole": "^2.0", "swoole/swoole": "^4.7" }
完成后,运行以下命令进行安装:
composer install
接下来,我们需要创建一个控制器来处理 WebSocket 的请求。在 app/controller
目录下创建一个名为 Websocket.php
的文件,写入以下代码:
<?php declare(strict_types=1); namespace appcontroller; use thinkswooleWebsocket as SwooleWebsocket; use SwooleWebSocketFrame; class Websocket extends SwooleWebsocket { /** * 监听连接事件 * @param SwooleWebSocketServer $server * @param SwooleHttpRequest $request */ public function onOpen($server, $request) { } /** * 监听接收消息事件 * @param SwooleWebSocketServer $server * @param Frame $frame */ public function onMessage($server, Frame $frame) { } /** * 监听关闭事件 * @param SwooleWebSocketServer $server * @param int $fd */ public function onClose($server, $fd) { } }
在上面的代码中,我们继承了 thinkswooleWebsocket
类,并重写了其中的三个方法:
onOpen
方法用于监听连接事件;onMessage
方法用于监听接收消息事件;onClose
方法用于监听关闭事件。当前,这些方法并没有做任何事情,接下来我们将会在这些方法中添加 WebSocket 通信的逻辑。
在控制器创建好之后,我们需要在路由中进行注册。在 app/route.php
文件中添加以下内容:
use thinkacadeRoute; Route::post('/ws', 'Websocket@onMessage')->middleware( hinkmiddlewareAllowCrossDomain::class);
这里使用了 Route::post
方法来注册路由。这个路由的请求方式是 POST
,路径为 /ws
,并将请求映射到了 Websocket
控制器的 onMessage
方法上。
现在,我们已经完成了 WebSocket 路由和控制器的创建与注册。接下来,我们需要在控制器中添加 WebSocket 通信的逻辑。我们将使用 Swoole 的 WebSocket 服务端来实现 WebSocket 通信。
在 onOpen
方法中,我们可以获取客户端的连接对象,并将其存储起来,以便后续使用。在 onMessage
方法中,我们可以获取客户端发送的消息,并将这条消息广播给其它客户端。在 onClose
方法中,我们需要将客户端从连接池中移除。
在 app/controller
目录下创建一个名为 WebSocketServer.php
的文件,写入以下代码:
<?php declare(strict_types=1); namespace appcontroller; use SwooleHttpResponse; use SwooleWebSocketFrame; use SwooleWebSocketServer; use thinkswoolewebsocketHandlerInterface; class WebSocketServer implements HandlerInterface { /** * @var array $connections */ private $connections = []; /** * 监听连接事件 * @param Server $server * @param SwooleHttpRequest $request */ public function onOpen(Server $server, SwooleHttpRequest $request): void { $this->connections[$request->fd] = $request->fd; echo "client-{$request->fd} is connected "; } /** * 监听消息事件 * @param Server $server * @param Frame $frame */ public function onMessage(Server $server, Frame $frame): void { foreach ($this->connections as $fd) { $info = $server->getClientInfo((int)$fd); if ($info && isset($info['websocket_status']) && $info['websocket_status'] == WEBSOCKET_STATUS_FRAME) { $server->push($fd, $frame->data); } else { unset($this->connections[$fd]); } } echo "received message from client-{$frame->fd}: {$frame->data} "; } /** * 监听关闭事件 * @param Server $server * @param int $fd * @param int $reactorId */ public function onClose(Server $server, int $fd, int $reactorId): void { unset($this->connections[$fd]); echo "client-{$fd} is closed "; } /** * @param Response $response */ public function onHandShake(Request $request, Response $response): bool { // Do nothing return true; } }
在写入 WebSocket 的服务代码之前,我们需要在 config
目录下创建一个名为 swoole.php
的配置文件,写入以下内容:
return [ 'socket_type' => 'websocket', 'host' => '0.0.0.0', 'port' => 9501, 'mode' => SWOOLE_PROCESS, 'sock_type' => SWOOLE_SOCK_TCP, 'settings' => [ 'worker_num' => swoole_cpu_num(), ], 'handler' => ppcontrollerWebSocketServer::class, ];
在上面的代码中,我们通过配置文件告诉应用程序如何启动 Swoole WebSocket 服务。我们启动 websocket
socket 类型,绑定在 0.0.0.0:9501
上,并开启了多进程模式,使用 TCP 协议。worker_num
配置项设置了服务器的进程数,这里使用了 swoole_cpu_num()
用于返回系统 CPU 数量;handler
配置项指定了我们在上文中创建的 WebSocketServer
类。
在完成了创建、配置 WebSocket 服务的代码之后,我们需要运行一下代码,来开启 WebSocket 服务。在命令行中执行以下命令即可:
php think swoole start --mode=websocket
Websocket 服务已经启动,你可以通过访问你的应用程序来测试它。你可以使用这个地址:ws://your-domain:9501/ws
rrreee
app/controller
디렉터리에 Websocket.php
라는 파일을 생성하고 다음 코드를 작성합니다. 🎜rrreee🎜위 코드에서는 thinkswooleWebsocket
을 상속했습니다. > 클래스이며 그 안에 있는 세 가지 메서드를 재정의합니다. 🎜🎜🎜onOpen
메서드는 연결 이벤트를 수신하는 데 사용됩니다. 🎜🎜onMessage
메서드는 수신 메시지 이벤트를 수신하는 데 사용됩니다. 🎜🎜onClose
메서드는 닫기 이벤트를 수신하는 데 사용됩니다. 🎜🎜🎜현재 이러한 메서드는 아무 작업도 수행하지 않습니다. 다음으로 이러한 메서드에 WebSocket 통신 논리를 추가하겠습니다. 🎜🎜Register Route🎜🎜컨트롤러가 생성된 후에는 이를 Route에 등록해야 합니다. app/route.php
파일에 다음 콘텐츠를 추가하세요. 🎜rrreee🎜여기에서는 Route::post
메서드를 사용하여 경로를 등록합니다. 이 경로의 요청 방법은 POST
이고 경로는 /ws
이며 요청은 Websocket의 <code>onMessage
에 매핑됩니다. 컨트롤러 > 방법론적으로. 🎜🎜WebSocket 통신 로직 작성🎜🎜이제 WebSocket 경로 및 컨트롤러 생성 및 등록이 완료되었습니다. 다음으로 컨트롤러에 WebSocket 통신을 위한 로직을 추가해야 합니다. WebSocket 통신을 구현하기 위해 Swoole의 WebSocket 서버를 사용하겠습니다. 🎜🎜 onOpen
메서드에서 클라이언트의 연결 개체를 가져와 나중에 사용할 수 있도록 저장할 수 있습니다. onMessage
메서드에서는 클라이언트가 보낸 메시지를 가져와서 이 메시지를 다른 클라이언트에 브로드캐스팅할 수 있습니다. onClose
메서드에서는 연결 풀에서 클라이언트를 제거해야 합니다. 🎜🎜app/controller
디렉토리에 WebSocketServer.php
라는 파일을 생성하고 다음 코드를 작성합니다: 🎜rrreee🎜WebSocket 서비스 구성🎜🎜WebSocket 작성 코드를 사용하려면 config
디렉터리에 swoole.php
라는 구성 파일을 만들고 다음 내용을 작성해야 합니다. 🎜rrreee🎜위 코드에서 애플리케이션에 방법을 알려줍니다. 구성 파일을 통해 Swoole WebSocket 서비스를 시작합니다. websocket
소켓 유형을 시작하고 이를 0.0.0.0:9501
에 바인딩한 다음 TCP 프로토콜을 사용하여 다중 프로세스 모드를 활성화합니다. worker_num
구성 항목은 서버의 프로세스 수를 설정합니다. 여기서 swoole_cpu_num()
는 시스템 CPU 수를 반환하는 데 사용됩니다. 구성 항목은 위에서 생성된 WebSocketServer
클래스를 지정합니다. 🎜🎜WebSocket 서비스 실행🎜🎜WebSocket 서비스를 생성하고 구성하는 코드를 완료한 후에는 코드를 실행하여 WebSocket 서비스를 시작해야 합니다. 명령줄에서 다음 명령을 실행하세요. 🎜rrreee🎜Websocket 서비스가 시작되었으며 애플리케이션에 액세스하여 테스트할 수 있습니다. 다음 주소를 사용할 수 있습니다: ws://your-domain:9501/ws
. 브라우저에서 여러 탭을 열어 WebSocket 연결, 메시지 보내기 및 받기 기능을 각각 테스트합니다. 🎜🎜요약🎜🎜이 글에서는 ThinkPHP 6 프레임워크를 사용하여 WebSocket 브로드캐스트 기능을 구현하는 방법을 소개합니다. 컨트롤러 생성, 경로 등록, WebSocket 통신 논리 작성, WebSocket 서비스 구성을 통해 이를 수행합니다. 이 예는 간단한 WebSocket 모범 사례로 사용될 수 있으며 보다 고급 WebSocket 기능을 개발하기 위한 참조를 제공합니다. 🎜위 내용은 ThinkPHP6을 사용하여 Websocket 브로드캐스트 구현의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!