> PHP 프레임워크 > Swoole > Swoole 기반 고성능 WebSocket 서버 개발 경험

Swoole 기반 고성능 WebSocket 서버 개발 경험

WBOY
풀어 주다: 2023-06-14 11:48:02
원래의
888명이 탐색했습니다.

Websocket은 TCP를 기반으로 구축된 전이중 통신 프로토콜로, 클라이언트와 서버가 실시간으로 데이터와 상호 작용할 수 있도록 해줍니다. Websocket 프로토콜은 실시간 데이터 전송 및 온라인 게임과 같은 애플리케이션 시나리오에 적합합니다. HTTP 프로토콜과 달리 Websocket은 각 요청에 대해 TCP 연결 설정이 필요한 HTTP 프로토콜의 단점을 피하면서 긴 연결을 유지할 수 있습니다. . 따라서 점점 더 많은 제품이 데이터 전송에 Websocket 프로토콜을 사용합니다.

Websocket 서버의 성능을 향상시키기 위해 Swoole 확장을 사용하여 개발할 수 있습니다. Swoole은 일반적으로 사용되는 고성능 PHP 네트워크 통신 프레임워크로 비동기식 이벤트 중심 모델을 기반으로 하며 React, Node.js 등 고성능 프레임워크에서 일반적으로 사용되는 코루틴을 구현하여 PHP 성능을 크게 향상시킵니다. 이번 글에서는 Swoole에서 고성능 Websocket 서버를 개발하는 방법을 소개하고 관련 경험을 공유하겠습니다.

1. Swoole 서비스 시작

Swoole 서비스를 시작하기 전에 먼저 Swoole 확장 프로그램을 설치해야 합니다. Swoole은 Windows, Linux, macOS 등과 같은 일반적인 운영 체제를 지원합니다. pecl 명령을 사용하여 확장 기능을 설치하거나 Swoole 공식 웹사이트에서 소스 코드를 다운로드하여 컴파일 및 설치할 수 있습니다. 여기서는 pecl 명령 설치를 예로 들어 보겠습니다.

pecl install swoole
로그인 후 복사

설치가 완료된 후 PHP 코드의 swoole_version() 함수를 사용하여 Swoole 버전 정보를 확인하여 확장 프로그램이 설치되었는지 확인할 수 있습니다. 올바르게 설치되었습니다. swoole_version()函数查看Swoole版本信息,以确保扩展已经被正确安装。

  1. 创建服务实例

在使用Swoole开发Websocket服务器前,首先需要创建一个服务实例,我们可以使用Swoole提供的SwooleWebSocketServer类来创建,如下:

$server = new SwooleWebSocketServer('0.0.0.0', 9501);
로그인 후 복사

其中,0.0.0.0表示监听所有可用的IP地址,9501表示监听的端口号。在创建实例后,我们可以对服务器进行一些配置,例如设置worker进程数、设置运行模式、启用TCP协议等,具体请参考Swoole官方文档。

  1. 注册事件回调函数

Websocket服务器与客户端的通信是通过事件回调函数来实现的,我们需要在服务实例中注册回调函数,以便服务实例能够响应相应的事件。Swoole提供了很多回调函数(例如onMessage、onOpen、onClose、onRequest、onHandShake等),我们在开发Websocket服务器时,通常需要注册如下三个回调函数:

//连接成功时触发
$server->on('open', function (SwooleWebSocketServer $server, $request) {
    //处理连接事件
});

//收到客户端消息时触发
$server->on('message', function (SwooleWebSocketServer $server, $frame) {
    //处理消息事件
});

//连接关闭时触发
$server->on('close', function (SwooleWebSocketServer $server, $fd) {
    //处理关闭事件
});
로그인 후 복사

其中,open事件在客户端成功建立连接后,message事件在客户端发送消息后,close事件在连接关闭后触发。在Swoole中,$frame对象表示WebSocket消息的数据体,可以通过$frame->data获取消息的具体内容。

  1. 启动服务

注册完回调函数后,我们就可以启动服务,代码如下:

$server->start();
로그인 후 복사

在启动服务时,会自动创建worker进程和reactor线程,用于处理客户端连接和消息发送等业务流程。

二、Websocket服务开发经验

在使用Swoole开发Websocket服务器时,还需要注意以下几个方面:

  1. 心跳机制

Websocket协议不像HTTP协议中有明确的请求和响应,而是采用消息推送的方式进行实时数据传输。由于Websocket服务器需要长时间监听客户端的连接和消息传输,一旦客户端断开连接就无法发送消息,因此需要我们实现心跳机制,定时向客户端发送心跳请求,以维持连接。在Swoole中,我们可以使用pingpong消息来实现心跳机制。

//心跳包
$server->tick(30000, function () use ($server) {
    foreach ($server->connections as $fd) {
        $server->push($fd, json_encode(['type' => 'ping']));
    }
});

//心跳响应
$server->on('message', function (SwooleWebSocketServer $server, $frame) {
    if ($frame->data == 'pong') {
        //处理心跳响应
    }
});
로그인 후 복사

其中,tick函数可以定时向客户端发送心跳请求,onMessage回调函数中可以处理客户端的心跳响应,以确保客户端与服务端保持连接。

  1. 消息广播

Websocket服务器很常见的场景是向所有客户端广播消息,例如弹幕、多人游戏等。在Swoole中,我们可以使用push方法广播消息。

//处理广播消息
$message = 'Hello, everyone!';
foreach ($server->connections as $fd) {
    $server->push($fd, $message);
}
로그인 후 복사

此外,还可以根据客户端的连接信息,针对性向特定客户端发送消息。

  1. 数据格式化

Websocket协议中,客户端和服务端通信的数据可能以JSON、XML等格式传输,因此在处理接收到的数据时,我们需要对数据进行格式化处理,例如使用json_decode

    서비스 인스턴스 생성
    1. Swoole을 사용하여 Websocket 서버를 개발하기 전에 먼저 Swoole에서 제공하는 SwooleWebSocketServer 클래스를 사용하여 서비스 인스턴스를 생성해야 합니다.
    //处理消息事件
    $server->on('message', function (SwooleWebSocketServer $server, $frame) {
        $data = json_decode($frame->data, true);
        //处理数据
    });
    로그인 후 복사

    where , 0.0.0.0은 사용 가능한 모든 IP 주소에서 수신 대기를 의미하고 9501은 수신 포트 번호를 의미합니다. 인스턴스를 생성한 후 작업자 프로세스 수 설정, 운영 모드 설정, TCP 프로토콜 활성화 등과 같은 일부 구성을 서버에서 수행할 수 있습니다. 자세한 내용은 Swoole 공식 문서를 참조하세요.

      이벤트 콜백 함수 등록

      🎜🎜웹소켓 서버와 클라이언트 간의 통신은 이벤트 콜백 함수를 통해 이루어지므로 서비스 인스턴스에 콜백 함수를 등록해야 합니다. 인스턴스는 해당 이벤트에 응답할 수 있습니다. Swoole은 많은 콜백 함수(예: onMessage, onOpen, onClose, onRequest, onHandShake 등)를 제공합니다. Websocket 서버를 개발할 때 일반적으로 다음 세 가지 콜백 함수를 등록해야 합니다. 🎜
      $server->set([
          'worker_num' => 4,
      ]);
      로그인 후 복사
      🎜 그 중 open 이벤트가 발생합니다. 클라이언트가 성공적으로 연결을 설정한 후 클라이언트가 메시지를 보낸 후 메시지 이벤트가 트리거되고 연결이 닫힌 후에 닫기 이벤트가 트리거됩니다. Swoole에서 $frame 객체는 WebSocket 메시지의 데이터 본문을 나타내며, 메시지의 특정 내용은 $frame->data를 통해 얻을 수 있습니다. 🎜
        🎜서비스 시작🎜🎜🎜콜백 함수를 등록한 후 서비스를 시작할 수 있습니다. 코드는 다음과 같습니다. 🎜rrreee🎜서비스를 시작하면 작업자 프로세스와 리액터 스레드가 클라이언트 연결, 메시지 전송 등 비즈니스 프로세스 처리를 위해 자동으로 생성됩니다. 🎜🎜2. Websocket 서비스 개발 경험🎜🎜Swoole을 사용하여 Websocket 서버를 개발할 때 다음 측면에도 주의해야 합니다. 🎜
          🎜Heartbeat 메커니즘🎜🎜🎜Websocket 프로토콜에는 명확한 요청과 응답이 없습니다. 대신 HTTP 프로토콜과 마찬가지로 메시지 푸시가 실시간 데이터 전송에 사용됩니다. Websocket 서버는 클라이언트의 연결과 메시지 전송을 오랫동안 모니터링해야 하기 때문에 클라이언트 연결이 끊어지면 메시지를 보낼 수 없습니다. 따라서 연결을 유지하려면 하트비트 메커니즘을 구현하고 클라이언트에 정기적으로 하트비트 요청을 보내야 합니다. Swoole에서는 pingpong 메시지를 사용하여 하트비트 메커니즘을 구현할 수 있습니다. 🎜rrreee🎜 그 중 tick 함수는 클라이언트에 정기적으로 하트비트 요청을 보낼 수 있으며, onMessage 콜백 함수는 클라이언트의 하트비트 응답을 처리하여 클라이언트가 하트비트를 유지하는지 확인할 수 있습니다. 서버와의 연결. 🎜
            🎜메시지 브로드캐스트🎜🎜🎜Websocket 서버의 매우 일반적인 시나리오는 공격, 멀티플레이어 게임 등과 같은 메시지를 모든 클라이언트에 브로드캐스트하는 것입니다. Swoole에서는 push 메서드를 사용하여 메시지를 브로드캐스트할 수 있습니다. 🎜rrreee🎜또한 클라이언트의 연결 정보를 기반으로 특정 클라이언트에게 타겟 메시지를 보낼 수도 있습니다. 🎜
              🎜데이터 형식화🎜🎜🎜Websocket 프로토콜에서는 클라이언트와 서버 간에 전달되는 데이터가 JSON, XML 및 기타 형식으로 전송될 수 있으므로 수신된 데이터를 처리할 때 다음을 수행해야 합니다. json_decode를 사용하여 JSON 형식을 구문 분석하는 등의 형식 지정을 수행합니다. 🎜rrreee🎜🎜다중 프로세스 관리🎜🎜🎜Websocket 서버에서는 클라이언트 요청이 많을 것입니다. 서버의 처리 능력을 향상시키기 위해 Swoole의 다중 프로세스 관리 기능을 사용할 수 있습니다. Swoole은 Master 프로세스와 여러 Worker 프로세스를 지원합니다. Master 프로세스는 Worker 프로세스를 관리하는 데 사용되며 Worker 프로세스는 특정 클라이언트 요청을 처리하는 역할을 합니다. 다양한 크기의 요청 로드에 맞게 서비스 인스턴스를 생성할 때 작업자 프로세스 수를 설정할 수 있습니다. 🎜rrreee🎜다중 프로세스 환경에서는 데이터 동기화 및 공유 문제에 주의해야 합니다. 프로세스 간 통신 및 동기화를 달성하려면 Swoole에서 제공하는 Process, Table, Atomic, Mutex 및 기타 구성 요소를 사용할 수 있습니다. 🎜

              간단히 말하면 Swoole을 사용하여 Websocket 서버를 개발하면 서버의 성능과 안정성이 크게 향상될 수 있으며, 이를 위해서는 Swoole의 관련 기능과 개발 기술에 능숙해야 합니다. 이 글이 개발자들에게 도움이 되고 고성능 웹소켓 서버의 더 나은 구현을 위한 참고 자료가 되기를 바랍니다.

      위 내용은 Swoole 기반 고성능 WebSocket 서버 개발 경험의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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