PHP API 개발에서 Long Polling 및 WebSocket을 처리하는 방법

PHPz
풀어 주다: 2023-06-17 09:02:01
원래의
1295명이 탐색했습니다.

인터넷과 모바일 인터넷의 발전으로 실시간 통신 기능을 구현해야 하는 애플리케이션이 점점 더 많아지고 있습니다. 웹 개발에서 Long Polling과 WebSocket은 실시간 통신 기능을 구현할 수 있는 두 가지 일반적으로 사용되는 프로토콜입니다. PHP API 개발에서는 Long Polling과 WebSocket을 어떻게 처리할지가 고려되어야 할 문제입니다.

1. 롱 폴링

롱 폴링(Long Polling)은 실시간 통신을 가능하게 하는 기술입니다. 기본 원칙은 클라이언트가 서버에 요청을 보내고 서버는 요청에 즉시 응답하지 않고 연결을 유지하고 클라이언트에 반환하기 전에 새 데이터를 기다리는 것입니다. 데이터를 받은 후.

PHP API 개발에서 긴 폴링을 처리하는 방법은 연결을 열어두고 데이터가 반환될 때까지 기다려야 한다는 점을 제외하면 일반 요청을 처리하는 것과 유사합니다. 다음은 샘플 코드입니다.

<?php
// 开启一个长轮询连接
while(true) {
    // 查询是否有新的数据
    $new_data = get_new_data();
    if(!empty($new_data)) {
        // 返回查询到的新数据
        echo json_encode($new_data);
        // 关闭连接,等待下一次请求
  exit;
    }
    // 等待一段时间再次查询
    sleep(1);
}
?>
로그인 후 복사

위 코드에서는 while 루프를 사용하여 연결을 열어두고 새 데이터가 클라이언트에 반환될 때까지 기다린 후 새 데이터가 있는지 다시 쿼리하기 위해 잠시 기다립니다. 이 방법은 각 연결이 프로세스를 차지하므로 동시성이 높은 시나리오에는 적합하지 않습니다. 동시에 긴 폴링을 수행하는 클라이언트가 많으면 서버가 빨리 소모됩니다.

이 문제를 해결하기 위해 이벤트 리스너나 메시지 대기열을 사용하여 긴 폴링 요청을 처리할 수 있습니다. 새 데이터가 있으면 이벤트 리스너를 트리거하거나 메시지 큐에 푸시한 다음 긴 폴링 연결을 사용하여 데이터를 가져옵니다. 이를 통해 서버의 부하를 줄이고 시스템의 안정성을 향상시킬 수 있습니다. 다음은 Redis를 사용하여 Long Polling 요청을 처리하기 위한 샘플 코드입니다.

<?php
$redis = new Redis();
$redis->connect('127.0.0.1',6379);

// 开启一个长轮询连接
while(true) {
    $new_data = $redis->subscribe(['new_data']);
    if(!empty($new_data)) {
        // 返回新数据
        echo json_encode($new_data);
        // 关闭连接,等待下一次请求
  exit;
    }
}
?>
로그인 후 복사

위 코드에서는 Redis의 구독 메서드를 사용하여 새 데이터가 푸시되는 것을 모니터링하고 이를 클라이언트에 반환합니다. 연결을 종료합니다. 이 방법은 서버 리소스를 차지하지 않으며 동시성이 높은 실시간 통신 시나리오에 적합합니다.

2. WebSocket

WebSocket은 실시간 통신을 가능하게 하는 또 다른 기술로 클라이언트와 서버 간에 지속적인 양방향 연결을 설정하여 실시간 통신을 구현할 수 있습니다. WebSocket에서는 반복적으로 연결을 설정하고 닫을 필요 없이 클라이언트와 서버 간에 메시지를 보낼 수 있으므로 통신 효율성이 크게 향상됩니다.

PHP API 개발에서는 Ratchet, Swoole 등과 같은 타사 라이브러리를 사용하여 WebSocket을 처리할 수 있습니다. WebSocket 프로토콜은 이러한 라이브러리를 사용하여 쉽게 구현할 수 있으며 다양한 사용자 정의 프로토콜 및 이벤트도 지원할 수 있어 개발이 매우 편리합니다. 다음은 Ratchet을 사용하여 WebSocket을 처리하는 샘플 코드입니다.

<?php
require __DIR__ . '/vendor/autoload.php';

use RatchetMessageComponentInterface;
use RatchetConnectionInterface;
use RatchetServerIoServer;
use RatchetHttpHttpServer;
use RatchetWebSocketWsServer;

// 实现一个聊天服务
class Chat implements MessageComponentInterface {
    protected $clients;

    public function __construct() {
        $this->clients = new SplObjectStorage;
    }

    public function onOpen(ConnectionInterface $conn) {
        // 新的客户端连接
        $this->clients->attach($conn);
    }

    public function onMessage(ConnectionInterface $conn, $msg) {
        // 收到客户端消息
        foreach ($this->clients as $client) {
            if ($conn === $client) {
                continue;
            }
            $client->send($msg); // 发送消息给其他客户端
        }
    }

    public function onClose(ConnectionInterface $conn) {
        // 客户端断开连接
        $this->clients->detach($conn);
    }

    public function onError(ConnectionInterface $conn, Exception $e) {
      // 出错时的处理
    }
}

// 启动聊天服务
$server = IoServer::factory(
    new HttpServer(
        new WsServer(
            new Chat()
        )
    ),
    8080
);
$server->run();
?>
로그인 후 복사

위 코드에서는 Ratchet을 사용하여 클라이언트가 연결되면 클라이언트가 메시지를 보낼 때 onOpen 메서드가 트리거됩니다. onMessage 메소드가 트리거되고, 클라이언트 연결이 끊어지면 onClose 메소드가 트리거되고, 오류가 발생하면 onError 메소드가 트리거됩니다. 이 서비스에서는 클라이언트가 보낸 메시지를 다른 클라이언트에게 간단히 방송하여 간단한 채팅방을 구현합니다.

요약

PHP API 개발에서는 Long Polling과 WebSocket을 처리하기 위해 다양한 기술과 방법을 사용할 수 있습니다. Long Polling 방법은 비교적 간단합니다. while 루프를 사용하여 새 데이터가 도착할 때까지 기다릴 수 있지만 서버 리소스를 차지합니다. WebSocket 메서드는 상대적으로 복잡하며 타사 라이브러리를 사용하여 구현할 수 있으며 다양한 사용자 정의 프로토콜과 이벤트를 지원할 수 있어 개발이 매우 편리합니다. 어떤 방법을 사용하더라도 시스템의 안정성과 신뢰성을 보장하기 위해서는 서버의 자원 점유 및 성능 문제를 고려해야 합니다.

위 내용은 PHP API 개발에서 Long Polling 및 WebSocket을 처리하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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