ThinkPHP6을 사용하여 Websocket 브로드캐스트 구현

WBOY
풀어 주다: 2023-06-20 08:41:34
원래의
1673명이 탐색했습니다.

현대 웹 애플리케이션의 지속적인 발전으로 실시간 커뮤니케이션은 꼭 필요한 기능 중 하나가 되었습니다. WebSocket 기술은 가장 널리 사용되는 실시간 통신 방법 중 하나로, 서버와 클라이언트 간에 지속적인 양방향 연결을 설정하여 실시간 통신을 달성할 수 있습니다.

ThinkPHP는 매우 인기 있는 PHP 프레임워크입니다. ThinkPHP 6은 Swoole 확장 패키지와 함께 제공되므로 WebSocket 기술을 매우 간단하게 사용할 수 있습니다. 이 기사에서는 ThinkPHP 6 프레임워크를 사용하여 WebSocket 브로드캐스트 기능을 구현하는 방법을 소개합니다.

환경 요구사항

시작하기 전에 다음 환경을 준비해야 합니다.

  • PHP 7.2+
  • Swoole Extension
  • Composer
  • 기본 웹 개발 지식

프로젝트 만들기

먼저 새 프로젝트:

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 thinkacadeRoute;

Route::post('/ws', 'Websocket@onMessage')->middleware(    hinkmiddlewareAllowCrossDomain::class);
로그인 후 복사

这里使用了 Route::post 方法来注册路由。这个路由的请求方式是 POST,路径为 /ws,并将请求映射到了 Websocket 控制器的 onMessage 方法上。

编写 WebSocket 通信逻辑

现在,我们已经完成了 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 服务

在写入 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 服务的代码之后,我们需要运行一下代码,来开启 WebSocket 服务。在命令行中执行以下命令即可:

php think swoole start --mode=websocket
로그인 후 복사

Websocket 服务已经启动,你可以通过访问你的应用程序来测试它。你可以使用这个地址:ws://your-domain:9501/wsrrreee

완료 후 다음 명령을 실행합니다. 설치 방법:

rrreee

Create control Controller

다음으로 WebSocket 요청을 처리할 컨트롤러를 만들어야 합니다. 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿