如何基于Hyperf实现RabbitMQ+WebSocket消息推送
介绍
基于 Hyperf+ WebSocket +RabbitMQ 实现的一个简单大屏幕的消息推送。
思路
利用 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教程》
Atas ialah kandungan terperinci 如何基于Hyperf实现RabbitMQ+WebSocket消息推送. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Hyperf ialah rangka kerja PHP yang sangat baik. Ciri utamanya adalah pantas, fleksibel dan berskala Ia kini digunakan secara meluas dalam industri. Dalam proses membangunkan menggunakan rangka kerja Hyperf, kami sering menghadapi situasi yang memerlukan pengurusan konfigurasi. Artikel ini akan memperkenalkan cara menggunakan rangka kerja Hyperf untuk pengurusan konfigurasi dan memberikan contoh kod khusus. 1. Lokasi fail konfigurasi Apabila membangun menggunakan rangka kerja Hyperf, fail konfigurasi biasanya diletakkan dalam direktori konfigurasi, atau ia boleh dimasukkan ke dalam fail .env.

Cara menggunakan rangka kerja Hyperf untuk memuat turun fail Pengenalan: Muat turun fail adalah keperluan biasa apabila membangunkan aplikasi web menggunakan rangka kerja Hyperf. Artikel ini akan memperkenalkan cara menggunakan rangka kerja Hyperf untuk memuat turun fail, termasuk contoh kod khusus. 1. Persediaan Sebelum memulakan, pastikan anda telah memasang rangka kerja Hyperf dan berjaya mencipta aplikasi Hyperf. 2. Buat pengawal muat turun fail Mula-mula, kita perlu mencipta pengawal untuk mengendalikan permintaan muat turun fail. Buka terminal dan masuk

Sejak dilahirkan pada tahun 2004, PHP telah menjadi salah satu bahasa pembangunan yang paling popular di dunia. Dengan perkembangan pesat Internet dan inovasi teknologi yang berterusan, pembangunan PHP juga berubah setiap hari. Antaranya, seni bina perkhidmatan mikro secara beransur-ansur menjadi trend popular dalam pembangunan perisian hari ini. Artikel ini akan membawa anda ke dalam dunia pembangunan perkhidmatan mikro PHPHyperf, daripada kemasukan kepada kemahiran. 1. Apakah seni bina perkhidmatan mikro? Seni bina Microservices ialah seni bina sistem yang dibina di atas satu set komponen perkhidmatan yang kecil dan digunakan secara bebas. Berbanding dengan seni bina aplikasi monolitik tradisional, seni bina perkhidmatan mikro

Cara menggunakan rangka kerja Hyperf untuk mengehadkan permintaan semasa Pengenalan: Dalam aplikasi Internet moden, cara memastikan kestabilan sistem di bawah konkurensi tinggi adalah sangat penting. Permintaan pendikit adalah salah satu strategi mengatasi biasa. Artikel ini akan memperkenalkan cara menggunakan rangka kerja Hyperf untuk mengehadkan aliran permintaan dan memberikan contoh kod khusus. 1. Apakah pengehadan semasa permintaan? Pengehadan semasa permintaan merujuk kepada mengehadkan bilangan lawatan permintaan ke sistem dalam tempoh masa untuk mengelakkan sistem daripada ranap kerana terlalu banyak permintaan. Melalui strategi pengehadan semasa yang munasabah, kualiti dan kestabilan perkhidmatan yang lebih baik dapat disediakan. H

Cara menggunakan rangka kerja Hyperf untuk paging data Pengenalan: Paging data adalah sangat biasa dalam pembangunan Web sebenar Paging boleh memudahkan pengguna menyemak imbas data yang banyak. Hyperf ialah rangka kerja PHP berprestasi tinggi yang menyediakan set ciri dan komponen yang berkuasa. Artikel ini akan memperkenalkan cara menggunakan rangka kerja Hyperf untuk halaman data dan memberikan contoh kod terperinci. 1. Penyediaan: Sebelum memulakan, anda perlu memastikan bahawa rangka kerja Hyperf telah dipasang dan dikonfigurasikan dengan betul. Boleh dilakukan melalui Komposer

Cara menggunakan rangka kerja Hyperf untuk pemprosesan imej Pengenalan: Dengan perkembangan pesat Internet mudah alih, pemprosesan imej telah menjadi semakin penting dalam pembangunan Web moden. Hyperf ialah rangka kerja berprestasi tinggi berdasarkan Swoole, yang menyediakan pelbagai komponen dan fungsi, termasuk pemprosesan imej. Artikel ini akan memperkenalkan cara menggunakan rangka kerja Hyperf untuk pemprosesan imej dan memberikan contoh kod khusus. 1. Pasang rangka kerja Hyperf: Sebelum memulakan, kami pastikan dahulu rangka kerja Hyperf telah dipasang. kompo

Cara menggunakan rangka kerja Hyperf untuk pengurusan cache Cache ialah salah satu cara penting untuk meningkatkan prestasi aplikasi, dan rangka kerja moden memberikan kami alat pengurusan cache yang lebih mudah. Artikel ini akan memperkenalkan cara menggunakan rangka kerja Hyperf untuk pengurusan cache dan memberikan contoh kod khusus. Rangka kerja Hyperf ialah rangka kerja berprestasi tinggi yang dibangunkan berdasarkan Swoole Ia mempunyai set komponen dan alatan terbina dalam yang kaya, termasuk fungsi pengurusan cache yang berkuasa. Rangka kerja Hyperf menyokong berbilang pemacu cache, seperti Redis dan Memcach.

Dalam beberapa tahun kebelakangan ini, seni bina perkhidmatan mikro telah menjadi cara arus perdana untuk membina aplikasi moden. Ia meningkatkan kebolehskalaan, kebolehselenggaraan dan kebolehlaksanaan aplikasi besar dengan membahagikannya kepada perkhidmatan autonomi yang kecil. Dalam seni bina perkhidmatan mikro, setiap perkhidmatan dibangunkan, digunakan dan dijalankan secara bebas, dan ia berinteraksi melalui mekanisme komunikasi yang ringan. Apabila membina aplikasi perkhidmatan mikro, memilih rangka kerja pembangunan yang sesuai adalah sangat kritikal. PHPHyperf ialah rangka kerja mikro perkhidmatan berdasarkan rangka kerja rangkaian coroutine berprestasi tinggi Swoole
