Heim Backend-Entwicklung PHP-Tutorial So implementieren Sie den RabbitMQ+WebSocket-Nachrichten-Push basierend auf Hyperf

So implementieren Sie den RabbitMQ+WebSocket-Nachrichten-Push basierend auf Hyperf

May 06, 2020 pm 01:49 PM
hyperf

Einführung

Ein einfacher Nachrichten-Push auf großem Bildschirm basierend auf Hyperf+ WebSocket +RabbitMQ.

Idee

Verwenden Sie das WebSocket-Protokoll, um eine zustandsbehaftete lange Verbindung zwischen dem Client und dem Server aufrechtzuerhalten, und

speichern Sie die Client-ID aus der Verbindung . Durch das Abonnieren von von einem Herausgeber veröffentlichten Nachrichten werden Nachrichten an eine gespeicherte Client-ID gesendet.

WebSocket-Dienst

composer require hyperf/websocket-server
Nach dem Login kopieren

Konfigurationsdatei [config/autoload/server.php]

<?php
return [
    &#39;mode&#39; => SWOOLE_PROCESS,
    &#39;servers&#39; => [
        [
            &#39;name&#39; => &#39;http&#39;,
            &#39;type&#39; => Server::SERVER_HTTP,
            &#39;host&#39; => &#39;0.0.0.0&#39;,
            &#39;port&#39; => 11111,
            &#39;sock_type&#39; => SWOOLE_SOCK_TCP,
            &#39;callbacks&#39; => [
                SwooleEvent::ON_REQUEST => [Hyperf\HttpServer\Server::class, &#39;onRequest&#39;],
            ],
        ],
        [
            &#39;name&#39; => &#39;ws&#39;,
            &#39;type&#39; => Server::SERVER_WEBSOCKET,
            &#39;host&#39; => &#39;0.0.0.0&#39;,
            &#39;port&#39; => 12222,
            &#39;sock_type&#39; => SWOOLE_SOCK_TCP,
            &#39;callbacks&#39; => [
                SwooleEvent::ON_HAND_SHAKE => [Hyperf\WebSocketServer\Server::class, &#39;onHandShake&#39;],
                SwooleEvent::ON_MESSAGE => [Hyperf\WebSocketServer\Server::class, &#39;onMessage&#39;],
                SwooleEvent::ON_CLOSE => [Hyperf\WebSocketServer\Server::class, &#39;onClose&#39;],
            ],
        ],
    ],
Nach dem Login kopieren

WebSocket-Server Ende des Codebeispiels

<?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(&#39;websocket_sjd_1&#39;);
        //如果当前客户端在客户端集合中,就刷新
        if (in_array($frame->fd, $fdList)) {
            $redis->sAdd(&#39;websocket_sjd_1&#39;, $frame->fd);
            $redis->expire(&#39;websocket_sjd_1&#39;, 7200);
        }
        $server->push($frame->fd, &#39;Recv: &#39; . $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(&#39;websocket_sjd_1&#39;, $fd);
        var_dump(&#39;closed&#39;);
    }
    /**
     * 客户端链接
     * @param WebSocketServer $server
     * @param Request $request
     */
    public function onOpen(WebSocketServer $server, Request $request): void
    {
        //保存客户端id
        $redis = $this->container->get(\Redis::class);
        $res1 = $redis->sAdd(&#39;websocket_sjd_1&#39;, $request->fd);
        var_dump($res1);
        $res = $redis->expire(&#39;websocket_sjd_1&#39;, 7200);
        var_dump($res);
        $server->push($request->fd, &#39;Opened&#39;);
    }
}
Nach dem Login kopieren

WebSocket-Frontend-Code

    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!");
        }
    }
Nach dem Login kopieren

AMQP-Komponente

composer require hyperf/amqp
Nach dem Login kopieren

Konfiguration Datei[ config/autoload/amqp.php]

<?php
return [
    &#39;default&#39; => [
        &#39;host&#39; => &#39;localhost&#39;,
        &#39;port&#39; => 5672,
        &#39;user&#39; => &#39;guest&#39;,
        &#39;password&#39; => &#39;guest&#39;,
        &#39;vhost&#39; => &#39;/&#39;,
        &#39;pool&#39; => [
            &#39;min_connections&#39; => 1,
            &#39;max_connections&#39; => 10,
            &#39;connect_timeout&#39; => 10.0,
            &#39;wait_timeout&#39; => 3.0,
            &#39;heartbeat&#39; => -1,
        ],
        &#39;params&#39; => [
            &#39;insist&#39; => false,
            &#39;login_method&#39; => &#39;AMQPLAIN&#39;,
            &#39;login_response&#39; => null,
            &#39;locale&#39; => &#39;en_US&#39;,
            &#39;connection_timeout&#39; => 3.0,
            &#39;read_write_timeout&#39; => 6.0,
            &#39;context&#39; => null,
            &#39;keepalive&#39; => false,
            &#39;heartbeat&#39; => 3,
        ],
    ],
];
Nach dem Login kopieren

MQ-Verbrauchercode

<?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(&#39;websocket_sjd_1&#39;);
        $server=$this->container->get(ServerFactory::class)->getServer()->getServer();
        foreach($fdList as $key=>$v){
            if(!empty($v)){
                $server->push((int)$v, $data);
            }
        }
        return Result::ACK;
    }
}
Nach dem Login kopieren

Controller-Code

    /**
     * test
     * @return array
     */
    public function test()
    {
        $data = array(
            &#39;code&#39; => 200,
            &#39;data&#39; => [
                &#39;userOutName&#39; => &#39;ccflow&#39;,
                &#39;userOutNum&#39; => &#39;9999&#39;,
                &#39;recordOutTime&#39; => date("Y-m-d H:i:s", time()),
                &#39;doorOutName&#39; => &#39;教师公寓&#39;,
            ]
        );
        $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(&#39;user&#39;, &#39;Hyperf&#39;);
        $method = $this->request->getMethod();
        return [
            &#39;method&#39; => $method,
            &#39;message&#39; => "{$user}.",
        ];
    }
Nach dem Login kopieren

Endeffekt

So implementieren Sie den RabbitMQ+WebSocket-Nachrichten-Push basierend auf Hyperf

Empfohlen: „PHP-Tutorial

Das obige ist der detaillierte Inhalt vonSo implementieren Sie den RabbitMQ+WebSocket-Nachrichten-Push basierend auf Hyperf. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

So verwenden Sie das Hyperf-Framework für das Konfigurationsmanagement So verwenden Sie das Hyperf-Framework für das Konfigurationsmanagement Oct 28, 2023 am 10:07 AM

Hyperf ist ein hervorragendes PHP-Framework, dessen Hauptfunktionen schnell, flexibel und skalierbar sind. Bei der Entwicklung mit dem Hyperf-Framework stoßen wir häufig auf Situationen, die ein Konfigurationsmanagement erfordern. In diesem Artikel wird die Verwendung des Hyperf-Frameworks für die Konfigurationsverwaltung vorgestellt und spezifische Codebeispiele bereitgestellt. 1. Der Speicherort der Konfigurationsdatei. Bei der Entwicklung mit dem Hyperf-Framework wird die Konfigurationsdatei normalerweise im Konfigurationsverzeichnis abgelegt oder kann in die .env-Datei eingegeben werden.

So verwenden Sie das Hyperf-Framework zum Herunterladen von Dateien So verwenden Sie das Hyperf-Framework zum Herunterladen von Dateien Oct 21, 2023 am 08:23 AM

So verwenden Sie das Hyperf-Framework zum Herunterladen von Dateien. Einführung: Das Herunterladen von Dateien ist eine häufige Anforderung bei der Entwicklung von Webanwendungen mit dem Hyperf-Framework. In diesem Artikel wird die Verwendung des Hyperf-Frameworks zum Herunterladen von Dateien vorgestellt, einschließlich spezifischer Codebeispiele. 1. Vorbereitung Bevor Sie beginnen, stellen Sie sicher, dass Sie das Hyperf-Framework installiert und erfolgreich eine Hyperf-Anwendung erstellt haben. 2. Erstellen Sie einen Datei-Download-Controller. Zuerst müssen wir einen Controller erstellen, um Datei-Download-Anfragen zu verarbeiten. Öffnen Sie das Terminal und betreten Sie es

PHP Hyperf Microservices-Entwicklungshandbuch: Vom Anfänger bis zum Meister PHP Hyperf Microservices-Entwicklungshandbuch: Vom Anfänger bis zum Meister Sep 12, 2023 am 10:31 AM

Seit seiner Geburt im Jahr 2004 ist PHP eine der beliebtesten Entwicklungssprachen der Welt. Mit der rasanten Entwicklung des Internets und der kontinuierlichen Innovation der Technologie verändert sich auch die Entwicklung von PHP von Tag zu Tag. Unter ihnen hat sich die Microservice-Architektur heute allmählich zu einem beliebten Trend in der Softwareentwicklung entwickelt. Dieser Artikel entführt Sie in die Welt der PHPHyperf-Microservice-Entwicklung, vom Einstieg bis zur Kompetenz. 1. Was ist Microservice-Architektur? Microservices-Architektur ist eine Systemarchitektur, die auf einer Reihe kleiner, unabhängig bereitgestellter Servicekomponenten basiert. Im Vergleich zur herkömmlichen monolithischen Anwendungsarchitektur wird die Microservice-Architektur verwendet

So verwenden Sie das Hyperf-Framework, um den Anforderungsfluss einzuschränken So verwenden Sie das Hyperf-Framework, um den Anforderungsfluss einzuschränken Oct 20, 2023 pm 01:58 PM

So verwenden Sie das Hyperf-Framework zur Anforderungsstrombegrenzung. Einführung: In modernen Internetanwendungen ist es sehr wichtig, die Stabilität des Systems bei hoher Parallelität sicherzustellen. Die Drosselung von Anfragen ist eine der häufigsten Bewältigungsstrategien. In diesem Artikel wird erläutert, wie Sie das Hyperf-Framework verwenden, um den Anforderungsfluss einzuschränken, und es werden spezifische Codebeispiele gegeben. 1. Was ist die Anforderungsstrombegrenzung? Unter Anforderungsstrombegrenzung versteht man die Begrenzung der Anzahl der Anforderungsbesuche im System innerhalb eines bestimmten Zeitraums, um zu verhindern, dass das System aufgrund zu vieler Anforderungen abstürzt. Durch vernünftige Strombegrenzungsstrategien kann eine bessere Servicequalität und Stabilität bereitgestellt werden. H

So verwenden Sie das Hyperf-Framework für das Daten-Paging So verwenden Sie das Hyperf-Framework für das Daten-Paging Oct 20, 2023 am 11:25 AM

So verwenden Sie das Hyperf-Framework für das Daten-Paging. Einführung: Daten-Paging ist in der tatsächlichen Webentwicklung weit verbreitet und kann Benutzern das Durchsuchen großer Datenmengen erleichtern. Hyperf ist ein leistungsstarkes PHP-Framework, das eine Reihe leistungsstarker Funktionen und Komponenten bietet. In diesem Artikel wird die Verwendung des Hyperf-Frameworks für das Daten-Paging vorgestellt und detaillierte Codebeispiele gegeben. 1. Vorbereitung: Bevor Sie beginnen, müssen Sie sicherstellen, dass das Hyperf-Framework korrekt installiert und konfiguriert wurde. Kann über Composer erfolgen

So verwenden Sie das Hyperf-Framework für die Bildverarbeitung So verwenden Sie das Hyperf-Framework für die Bildverarbeitung Oct 24, 2023 pm 12:04 PM

So verwenden Sie das Hyperf-Framework für die Bildverarbeitung. Einführung: Mit der rasanten Entwicklung des mobilen Internets ist die Bildverarbeitung in der modernen Webentwicklung immer wichtiger geworden. Hyperf ist ein leistungsstarkes Framework auf Basis von Swoole, das eine Fülle von Komponenten und Funktionen, einschließlich Bildverarbeitung, bereitstellt. In diesem Artikel wird die Verwendung des Hyperf-Frameworks für die Bildverarbeitung vorgestellt und spezifische Codebeispiele bereitgestellt. 1. Installieren Sie das Hyperf-Framework: Bevor wir beginnen, stellen wir zunächst sicher, dass das Hyperf-Framework installiert wurde. Compo

Erstellen skalierbarer Microservice-Anwendungen: Entdecken Sie die technischen Funktionen von PHP Hyperf Erstellen skalierbarer Microservice-Anwendungen: Entdecken Sie die technischen Funktionen von PHP Hyperf Sep 11, 2023 pm 07:01 PM

In den letzten Jahren hat sich die Microservices-Architektur zu einer gängigen Methode zum Erstellen moderner Anwendungen entwickelt. Es verbessert die Skalierbarkeit, Wartbarkeit und Bereitstellungsfähigkeit einer großen Anwendung, indem es sie in kleine, autonome Dienste aufteilt. In einer Microservice-Architektur wird jeder Service unabhängig entwickelt, bereitgestellt und ausgeführt und interagiert über einfache Kommunikationsmechanismen. Beim Erstellen von Microservice-Anwendungen ist die Auswahl eines geeigneten Entwicklungsframeworks sehr wichtig. PHPHyperf ist ein Microservice-Framework, das auf dem leistungsstarken Coroutine-Netzwerk-Framework von Swoole basiert

So verwenden Sie das Hyperf-Framework für die Cache-Verwaltung So verwenden Sie das Hyperf-Framework für die Cache-Verwaltung Oct 21, 2023 am 08:36 AM

So verwenden Sie das Hyperf-Framework für die Cache-Verwaltung. Cache ist eines der wichtigen Mittel zur Verbesserung der Anwendungsleistung, und moderne Frameworks bieten uns bequemere Tools für die Cache-Verwaltung. In diesem Artikel wird die Verwendung des Hyperf-Frameworks für die Cache-Verwaltung vorgestellt und spezifische Codebeispiele bereitgestellt. Das Hyperf-Framework ist ein auf Swoole basierendes Hochleistungs-Framework. Es verfügt über eine Vielzahl integrierter Komponenten und Tools, einschließlich leistungsstarker Cache-Verwaltungsfunktionen. Das Hyperf-Framework unterstützt mehrere Cache-Treiber wie Redis und Memcach.

See all articles