Hyperf 기반 RabbitMQ+WebSocket 메시지 푸시 구현 방법
소개
Hyperf+ WebSocket +RabbitMQ를 기반으로 한 간단한 대형 화면 메시지 푸시입니다.
Idea
WebSocket 프로토콜을 사용하여 클라이언트와 서버 간의 상태 저장 긴 링크를 유지하고,
링크의 클라이언트 ID를 저장하세요. 게시자가 게시한 메시지를 구독하면 저장된 클라이언트 ID에 대한 메시지가 브로드캐스트됩니다.
WebSocket 서비스
composer require hyperf/websocket-server
구성 파일 [config/autoload/server.php]
<?php return [ 'mode' => SWOOLE_PROCESS, 'servers' => [ [ 'name' => 'http', 'type' => Server::SERVER_HTTP, 'host' => '0.0.0.0', 'port' => 11111, 'sock_type' => SWOOLE_SOCK_TCP, 'callbacks' => [ SwooleEvent::ON_REQUEST => [Hyperf\HttpServer\Server::class, 'onRequest'], ], ], [ 'name' => 'ws', 'type' => Server::SERVER_WEBSOCKET, 'host' => '0.0.0.0', 'port' => 12222, 'sock_type' => SWOOLE_SOCK_TCP, 'callbacks' => [ SwooleEvent::ON_HAND_SHAKE => [Hyperf\WebSocketServer\Server::class, 'onHandShake'], SwooleEvent::ON_MESSAGE => [Hyperf\WebSocketServer\Server::class, 'onMessage'], SwooleEvent::ON_CLOSE => [Hyperf\WebSocketServer\Server::class, 'onClose'], ], ], ],
WebSocket 서버 측 코드 예시
<?php declare(strict_types=1); /** * This file is part of Hyperf. * * @link https://www.hyperf.io * @document https://doc.hyperf.io * @contact group@hyperf.io * @license https://github.com/hyperf-cloud/hyperf/blob/master/LICENSE */ namespace App\Controller; use Hyperf\Contract\OnCloseInterface; use Hyperf\Contract\OnMessageInterface; use Hyperf\Contract\OnOpenInterface; use Swoole\Http\Request; use Swoole\Server; use Swoole\Websocket\Frame; use Swoole\WebSocket\Server as WebSocketServer; class WebSocketController extends Controller implements OnMessageInterface, OnOpenInterface, OnCloseInterface { /** * 发送消息 * @param WebSocketServer $server * @param Frame $frame */ public function onMessage(WebSocketServer $server, Frame $frame): void { //心跳刷新缓存 $redis = $this->container->get(\Redis::class); //获取所有的客户端id $fdList = $redis->sMembers('websocket_sjd_1'); //如果当前客户端在客户端集合中,就刷新 if (in_array($frame->fd, $fdList)) { $redis->sAdd('websocket_sjd_1', $frame->fd); $redis->expire('websocket_sjd_1', 7200); } $server->push($frame->fd, 'Recv: ' . $frame->data); } /** * 客户端失去链接 * @param Server $server * @param int $fd * @param int $reactorId */ public function onClose(Server $server, int $fd, int $reactorId): void { //删掉客户端id $redis = $this->container->get(\Redis::class); //移除集合中指定的value $redis->sRem('websocket_sjd_1', $fd); var_dump('closed'); } /** * 客户端链接 * @param WebSocketServer $server * @param Request $request */ public function onOpen(WebSocketServer $server, Request $request): void { //保存客户端id $redis = $this->container->get(\Redis::class); $res1 = $redis->sAdd('websocket_sjd_1', $request->fd); var_dump($res1); $res = $redis->expire('websocket_sjd_1', 7200); var_dump($res); $server->push($request->fd, 'Opened'); } }
WebSocket 프런트 엔드 코드
function WebSocketTest() { if ("WebSocket" in window) { console.log("您的浏览器支持 WebSocket!"); var num = 0 // 打开一个 web socket var ws = new WebSocket("ws://127.0.0.1:12222"); ws.onopen = function () { // Web Socket 已连接上,使用 send() 方法发送数据 //alert("数据发送中..."); //ws.send("发送数据"); }; window.setInterval(function () { //每隔5秒钟发送一次心跳,避免websocket连接因超时而自动断开 var ping = {"type": "ping"}; ws.send(JSON.stringify(ping)); }, 5000); ws.onmessage = function (evt) { var d = JSON.parse(evt.data); console.log(d); if (d.code == 300) { $(".address").text(d.address) } if (d.code == 200) { var v = d.data console.log(v); num++ var str = `<div class="item"> <p>${v.recordOutTime}</p> <p>${v.userOutName}</p> <p>${v.userOutNum}</p> <p>${v.doorOutName}</p> </div>` $(".tableHead").after(str) if (num > 7) { num-- $(".table .item:nth-last-child(1)").remove() } } }; ws.error = function (e) { console.log(e) alert(e) } ws.onclose = function () { // 关闭 websocket alert("连接已关闭..."); }; } else { alert("您的浏览器不支持 WebSocket!"); } }
AMQP 구성요소
composer require hyperf/amqp
구성 파일 [config/autoload/amqp.php]
<?php return [ 'default' => [ 'host' => 'localhost', 'port' => 5672, 'user' => 'guest', 'password' => 'guest', 'vhost' => '/', 'pool' => [ 'min_connections' => 1, 'max_connections' => 10, 'connect_timeout' => 10.0, 'wait_timeout' => 3.0, 'heartbeat' => -1, ], 'params' => [ 'insist' => false, 'login_method' => 'AMQPLAIN', 'login_response' => null, 'locale' => 'en_US', 'connection_timeout' => 3.0, 'read_write_timeout' => 6.0, 'context' => null, 'keepalive' => false, 'heartbeat' => 3, ], ], ];
MQ 소비자 코드
<?php declare(strict_types=1); namespace App\Amqp\Consumer; use Hyperf\Amqp\Annotation\Consumer; use Hyperf\Amqp\Message\ConsumerMessage; use Hyperf\Amqp\Result; use Hyperf\Server\Server; use Hyperf\Server\ServerFactory; /** * @Consumer(exchange="hyperf", routingKey="hyperf", queue="hyperf", nums=1) */ class DemoConsumer extends ConsumerMessage { /** * rabbmitMQ消费端代码 * @param $data * @return string */ public function consume($data): string { print_r($data); //获取集合中所有的value $redis = $this->container->get(\Redis::class); $fdList=$redis->sMembers('websocket_sjd_1'); $server=$this->container->get(ServerFactory::class)->getServer()->getServer(); foreach($fdList as $key=>$v){ if(!empty($v)){ $server->push((int)$v, $data); } } return Result::ACK; } }
컨트롤러 코드
/** * test * @return array */ public function test() { $data = array( 'code' => 200, 'data' => [ 'userOutName' => 'ccflow', 'userOutNum' => '9999', 'recordOutTime' => date("Y-m-d H:i:s", time()), 'doorOutName' => '教师公寓', ] ); $data = \GuzzleHttp\json_encode($data); $message = new DemoProducer($data); $producer = ApplicationContext::getContainer()->get(Producer::class); $result = $producer->produce($message); var_dump($result); $user = $this->request->input('user', 'Hyperf'); $method = $this->request->getMethod(); return [ 'method' => $method, 'message' => "{$user}.", ]; }
최종 효과
추천: "PHP 튜토리얼 》
위 내용은 Hyperf 기반 RabbitMQ+WebSocket 메시지 푸시 구현 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Hyperf는 빠르고 유연하며 확장 가능한 뛰어난 PHP 프레임워크입니다. Hyperf 프레임워크를 사용하여 개발하는 과정에서 구성 관리가 필요한 상황에 자주 직면하게 됩니다. 이 문서에서는 구성 관리를 위해 Hyperf 프레임워크를 사용하는 방법을 소개하고 특정 코드 예제를 제공합니다. 1. 구성 파일의 위치 Hyperf 프레임워크를 사용하여 개발할 때 구성 파일은 일반적으로 config 디렉터리에 있거나 .env 파일에 입력될 수 있습니다.

파일 다운로드를 위해 Hyperf 프레임워크를 사용하는 방법 소개: 파일 다운로드는 Hyperf 프레임워크를 사용하여 웹 애플리케이션을 개발할 때 일반적인 요구 사항입니다. 이 문서에서는 특정 코드 예제를 포함하여 파일 다운로드에 Hyperf 프레임워크를 사용하는 방법을 소개합니다. 1. 준비 시작하기 전에 Hyperf 프레임워크를 설치했고 Hyperf 애플리케이션을 성공적으로 생성했는지 확인하세요. 2. 파일 다운로드 컨트롤러 생성 먼저 파일 다운로드 요청을 처리할 컨트롤러를 생성해야 합니다. 터미널을 열고 들어가세요

2004년 탄생 이후 PHP는 세계에서 가장 인기 있는 개발 언어 중 하나가 되었습니다. 인터넷의 급속한 발전과 지속적인 기술 혁신으로 인해 PHP의 개발도 날이 갈수록 변화하고 있습니다. 그 중 마이크로서비스 아키텍처는 오늘날 소프트웨어 개발에서 점차 인기 있는 트렌드가 되었습니다. 이 기사에서는 초보자부터 숙련까지 PHPHyperf 마이크로서비스 개발의 세계로 안내합니다. 1. 마이크로서비스 아키텍처란 무엇입니까? 마이크로서비스 아키텍처는 독립적으로 배포된 소규모 서비스 구성 요소 집합을 기반으로 구축된 시스템 아키텍처입니다. 마이크로서비스 아키텍처는 기존의 모놀리식 애플리케이션 아키텍처와 비교하여

요청 전류 제한을 위해 Hyperf 프레임워크를 사용하는 방법 소개: 최신 인터넷 애플리케이션에서는 높은 동시성에서 시스템의 안정성을 보장하는 방법이 매우 중요합니다. 요청 제한은 일반적인 대처 전략 중 하나입니다. 이 기사에서는 Hyperf 프레임워크를 사용하여 요청 흐름을 제한하고 특정 코드 예제를 제공하는 방법을 소개합니다. 1. 요청 전류 제한이란 무엇입니까? 요청 전류 제한은 너무 많은 요청으로 인해 시스템이 중단되는 것을 방지하기 위해 일정 기간 내에 시스템에 대한 요청 방문 횟수를 제한하는 것을 의미합니다. 합리적인 전류 제한 전략을 통해 더 나은 서비스 품질과 안정성을 제공할 수 있습니다. 시간

데이터 페이징을 위해 Hyperf 프레임워크를 사용하는 방법 소개: 데이터 페이징은 실제 웹 개발에서 매우 일반적입니다. 페이징을 사용하면 사용자가 대량의 데이터를 더 쉽게 탐색할 수 있습니다. Hyperf는 강력한 기능과 구성 요소 집합을 제공하는 고성능 PHP 프레임워크입니다. 이 기사에서는 데이터 페이징을 위해 Hyperf 프레임워크를 사용하는 방법을 소개하고 자세한 코드 예제를 제공합니다. 1. 준비: 시작하기 전에 Hyperf 프레임워크가 올바르게 설치 및 구성되었는지 확인해야 합니다. Composer를 통해 수행 가능

이미지 처리를 위해 Hyperf 프레임워크를 사용하는 방법 소개: 모바일 인터넷의 급속한 발전으로 인해 현대 웹 개발에서 이미지 처리가 점점 더 중요해지고 있습니다. Hyperf는 Swoole 기반의 고성능 프레임워크로 이미지 처리를 포함한 풍부한 구성 요소와 기능을 제공합니다. 이 기사에서는 이미지 처리를 위해 Hyperf 프레임워크를 사용하는 방법을 소개하고 특정 코드 예제를 제공합니다. 1. Hyperf 프레임워크 설치: 시작하기 전에 먼저 Hyperf 프레임워크가 설치되었는지 확인합니다. 컴포

캐시 관리를 위해 Hyperf 프레임워크를 사용하는 방법 캐시는 애플리케이션 성능을 향상시키는 중요한 수단 중 하나이며 최신 프레임워크는 보다 편리한 캐시 관리 도구를 제공합니다. 이 문서에서는 캐시 관리를 위해 Hyperf 프레임워크를 사용하는 방법을 소개하고 특정 코드 예제를 제공합니다. Hyperf 프레임워크는 Swoole을 기반으로 개발된 고성능 프레임워크로, 강력한 캐시 관리 기능을 포함하여 풍부한 내장 구성요소 및 도구 세트를 갖추고 있습니다. Hyperf 프레임워크는 Redis 및 Memcach와 같은 여러 캐시 드라이버를 지원합니다.

최근 몇 년 동안 마이크로서비스 아키텍처는 최신 애플리케이션을 구축하는 주류 방법이 되었습니다. 대규모 애플리케이션을 소규모 자율 서비스로 분할하여 확장성, 유지 관리성 및 배포 가능성을 향상시킵니다. 마이크로서비스 아키텍처에서 각 서비스는 독립적으로 개발, 배포 및 실행되며 경량 통신 메커니즘을 통해 상호 작용합니다. 마이크로서비스 애플리케이션을 구축할 때 적합한 개발 프레임워크를 선택하는 것은 매우 중요합니다. PHPHyperf는 Swoole의 고성능 코루틴 네트워크 프레임워크를 기반으로 하는 마이크로서비스 프레임워크입니다.
