>  기사  >  PHP 프레임워크  >  Swoole은 매우 안정적인 게시 및 구독 시스템을 구현합니다.

Swoole은 매우 안정적인 게시 및 구독 시스템을 구현합니다.

王林
王林원래의
2023-06-13 20:32:281553검색

인터넷이 발전함에 따라 실시간 메시지 푸시 및 구독을 구현해야 하는 애플리케이션이 점점 더 많아지고 있습니다. 이를 위해서는 이러한 수요를 지원하기 위해 매우 안정적인 게시 및 구독 시스템이 필요합니다. 고성능 네트워크 통신 프레임워크인 Swoole은 이러한 요구를 잘 충족할 수 있습니다.

Swoole은 비동기, 병렬, 고성능 네트워크 통신 및 다중 프로세스 동시 처리 기능을 제공할 수 있는 PHP 언어의 확장 모듈입니다. Swoole을 기반으로 개발된 애플리케이션은 더 높은 동시성과 더 짧은 응답 시간을 지원할 수 있습니다. 이 기사에서는 Swoole을 사용하여 매우 안정적인 게시 및 구독 시스템을 구현하는 방법을 소개합니다.

1. 게시-구독 시스템의 기본 개념

게시-구독 시스템은 일대다 메시지 게시 및 구독을 지원하는 메시징 모델입니다. 게시자는 하나 이상의 주제에 메시지를 게시하고 구독자는 자신의 관심 분야에 따라 이러한 주제를 구독하여 해당 메시지를 받을 수 있습니다.

게시 및 구독 시스템은 일반적으로 게시자, 구독자 및 메시지 브로커(메시지 브로커)의 세 부분으로 구성됩니다. 게시자는 메시지 브로커에 메시지를 보내고 구독자는 메시지 브로커의 메시지를 구독합니다. 게시자와 구독자 간에는 직접적인 통신이 없습니다. 메시지 브로커는 해당 구독자에게 메시지를 라우팅하는 역할을 담당합니다.

2. Swoole의 기본 개념

게시 및 구독 시스템을 구현하기 위해 Swoole을 이해하기 전에 Swoole의 몇 가지 기본 개념을 이해해야 합니다.

  1. Process

Swoole에서 프로세스는 독립적인 실행 환경을 의미합니다. Swoole은 다중 프로세스 지원을 제공하며 다중 프로세스를 생성하여 동시 처리를 달성할 수 있습니다.

  1. Server

서버는 Swoole 프레임워크의 핵심 모듈이며 TCP 또는 UDP 서버를 생성할 수 있습니다. 서버가 시작되면 기본 프로세스와 여러 하위 프로세스가 생성되며 기본 프로세스는 포트 수신을 담당하고 하위 프로세스는 특정 요청을 처리합니다.

  1. Timer

Swoole은 지정된 시간 간격 내에 코드를 실행할 수 있는 타이머 기능을 제공합니다. 타이머는 예약된 작업 및 예약된 확인과 같은 시나리오에서 사용할 수 있습니다.

  1. Coroutine

Coroutine은 하나의 스레드에서 여러 코루틴을 동시에 실행할 수 있는 경량 스레드입니다. 코루틴은 비동기 프로그래밍을 구현하고 기존 다중 스레드 프로그래밍에서 스레드 전환으로 인한 오버헤드를 피할 수 있습니다. Swoole은 동시성 네트워크 프로그래밍을 구현하는 데 사용할 수 있는 코루틴을 지원합니다.

3. Swoole을 사용하여 게시 및 구독 시스템을 구현하는 단계

다음으로 Swoole을 사용하여 게시 및 구독 시스템을 구현하는 방법을 소개하겠습니다. 코드 복잡성을 줄이기 위해 구독자에 의한 활성 폴링을 사용하여 구독 기능을 구현할 것입니다.

  1. 메시지 브로커 만들기

먼저 메시지를 수신하고 해당 구독자에게 라우팅하는 메시지 브로커를 만들어야 합니다. Swoole에서 제공하는 TCP 서버 및 프로세스 관리 기능을 사용하여 메시지 브로커를 구현할 수 있습니다.

$server = new SwooleServer('0.0.0.0', 8080, SWOOLE_PROCESS);
$server->set([
    'worker_num' => 2,
    'daemonize' => false,
]);
$server->on('WorkerStart', function($serv, $worker_id) {
    // 创建消息队列
    $queue_key = ftok(__FILE__, 'a');
    $queue = msg_get_queue($queue_key, 0666 | IPC_CREAT);
    // 将消息队列作为全局变量存放起来
    global $message_queue;
    $message_queue = $queue;
    // 启动消息处理进程
    if ($worker_id == 0) {
        $process = new SwooleProcess(function($process) {
            global $message_queue;
            while (true) {
                // 从消息队列中获取消息
                if (msg_receive($message_queue, 0, $msg_type, 1024, $msg, true, MSG_IPC_NOWAIT)) {
                    // 将消息发送给对应的订阅者
                    // TODO:实现发送消息的逻辑
                }
                // 隔一段时间循环一次
                usleep(100);
            }
        }, false, false);
        $process->start();
    }
});
$server->on('Connect', function($serv, $fd) {
    echo "Client[$fd]: Connect.
";
});
$server->on('Receive', function($serv, $fd, $from_id, $data) {
    global $message_queue;
    // 接收到消息,将消息存放到消息队列
    if (msg_send($message_queue, 1, $data, true, true)) {
        echo "Received message: $data
";
    } else {
        echo "Failed to send message to message queue.
";
    }
});
$server->on('Close', function($serv, $fd) {
    echo "Client[$fd]: Close.
";
});
$server->start();

위 코드에서는 TCP 서버를 생성하고 2개의 하위 프로세스를 설정했습니다. 각 하위 프로세스가 시작되면 메시지 큐를 생성하여 전역 변수 $message_queue에 저장합니다. 첫 번째 하위 프로세스에서는 메시지 대기열에서 메시지를 가져와 해당 구독자에게 메시지를 보내는 메시지 처리 프로세스를 만듭니다. 메시지를 받으면 msg_send 함수를 통해 메시지를 메시지 대기열에 저장합니다.

  1. 구독 기능 구현

구독 기능은 구독자가 자신의 관심사에 따라 구독해야 할 주제를 선택하여 관련 메시지를 받을 수 있다는 것을 의미합니다. Swoole의 코루틴을 통해 구독 기능을 구현할 수 있습니다.

$client = new SwooleClient(SWOOLE_SOCK_TCP);
if (!$client->connect('127.0.0.1', 8080)) {
    echo "Failed to connect to server.
";
    exit(1);
}
// 订阅主题
if (!$client->send("subscribe:topic1")) {
    echo "Failed to send subscribe message.
";
    exit(1);
}
// 接收消息
while (true) {
    $data = $client->recv();
    if ($data === false) {
        echo "Failed to receive message.
";
        break;
    }
    if (empty($data)) {
        continue;
    }
    echo "Received message: $data
";
}
$client->close();

위 코드에서는 TCP 클라이언트를 생성하고 메시지 브로커의 포트에 연결합니다. 구독 메시지는 전송 기능을 통해 전송되며 구독 주제는 topic1입니다. 메시지를 받을 때 루프를 사용하여 새 메시지가 있는지 확인하고, recv 함수를 사용하여 새 메시지를 차단하고 기다립니다.

  1. 게시 기능 구현

게시 기능은 게시자가 지정된 주제에 메시지를 게시할 수 있음을 의미합니다. Swoole의 TCP 클라이언트를 사용하여 게시 기능을 구현할 수 있습니다.

$client = new SwooleClient(SWOOLE_SOCK_TCP);
if (!$client->connect('127.0.0.1', 8080)) {
    echo "Failed to connect to server.
";
    exit(1);
}
// 发布消息
if (!$client->send("publish:topic1:message1")) {
    echo "Failed to send publish message.
";
    exit(1);
}
$client->close();

위 코드에서는 TCP 클라이언트를 생성하고 메시지 브로커의 포트에 연결합니다. 보내기 기능을 통해 메시지를 게시합니다. 게시 주제는 topic1이고 메시지 콘텐츠는 message1입니다.

4. 요약

Swoole은 고성능, 동시성 네트워크 애플리케이션을 구현하는 데 도움이 되는 강력한 네트워크 프로그래밍 프레임워크입니다. 이 기사에서는 Swoole을 사용하여 주로 메시지 에이전트 생성, 구독 기능 구현 및 게시 기능을 포함하는 매우 안정적인 게시 및 구독 시스템을 구현하는 방법을 소개합니다. Swoole을 사용하여 게시 및 구독 시스템을 구현하면 시스템의 성능과 안정성을 향상시킬 수 있으며 메시징 기능이 필요한 다양한 애플리케이션 시나리오에 적합합니다.

위 내용은 Swoole은 매우 안정적인 게시 및 구독 시스템을 구현합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.