인터넷과 모바일 인터넷의 발전으로 실시간 통신 기능을 구현해야 하는 애플리케이션이 점점 더 많아지고 있습니다. 웹 개발에서 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!