Start · Sprachen · PHP · Referenz · MongoDB\Driver\Monitoring\ServerChangedEvent

MongoDB\Driver\Monitoring\ServerChangedEvent

Klasse

Repräsentiert ein Ereignis, das ausgelöst wird, wenn sich der Zustand eines MongoDB-Servers im Topology ändert.

seit PHP 1.3.0 Kategorie: db

Signatur

class MongoDB\Driver\Monitoring\ServerChangedEvent

Beschreibung

MongoDB\Driver\Monitoring\ServerChangedEvent ist Teil des Server Discovery and Monitoring (SDAM)-Protokolls des MongoDB-PHP-Treibers. Ein Objekt dieser Klasse wird an registrierte Subscriber übergeben, wenn der Treiber eine Änderung am bekannten Zustand eines Servers feststellt – z. B. wenn ein Server von Unknown zu RSPrimary wechselt oder seine Latenz aktualisiert wird.

Die Klasse kann nicht direkt instanziiert werden; Objekte werden ausschließlich vom Treiber erzeugt und über die Methode serverChanged() des Interfaces MongoDB\Driver\Monitoring\SDAMSubscriber an den registrierten Beobachter weitergereicht.

Typische Einsatzbereiche sind das Logging von Topologie-Änderungen, Monitoring-Dashboards sowie automatisierte Failover-Diagnostik. Mithilfe der Getter-Methoden lassen sich sowohl der vorherige als auch der neue Serverzustand als MongoDB\Driver\ServerDescription-Objekte abrufen.

  • getPreviousDescription() – liefert den Serverzustand vor der Änderung
  • getNewDescription() – liefert den Serverzustand nach der Änderung
  • getTopologyId() – liefert die ID der betroffenen Topologie
  • getPort() – liefert den Port des betroffenen Servers
  • getHost() – liefert den Hostnamen des betroffenen Servers

Beispiele

Zustandsänderungen eines Servers protokollieren

<?php

use MongoDB\Driver\Monitoring\SDAMSubscriber;
use MongoDB\Driver\Monitoring\ServerChangedEvent;
use MongoDB\Driver\Monitoring\ServerClosedEvent;
use MongoDB\Driver\Monitoring\ServerOpeningEvent;
use MongoDB\Driver\Monitoring\TopologyChangedEvent;
use MongoDB\Driver\Monitoring\TopologyClosedEvent;
use MongoDB\Driver\Monitoring\TopologyOpeningEvent;
use MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent;
use MongoDB\Driver\Monitoring\ServerHeartbeatStartedEvent;
use MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent;

class ServerChangeLogger implements SDAMSubscriber
{
    public function serverChanged(ServerChangedEvent $event): void
    {
        $prev = $event->getPreviousDescription()->getType();
        $new  = $event->getNewDescription()->getType();

        printf(
            "[SDAM] Server %s:%d wechselte von '%s' zu '%s'\n",
            $event->getHost(),
            $event->getPort(),
            $prev,
            $new
        );
    }

    public function serverClosed(ServerClosedEvent $event): void {}
    public function serverOpening(ServerOpeningEvent $event): void {}
    public function topologyChanged(TopologyChangedEvent $event): void {}
    public function topologyClosed(TopologyClosedEvent $event): void {}
    public function topologyOpening(TopologyOpeningEvent $event): void {}
    public function serverHeartbeatFailed(ServerHeartbeatFailedEvent $event): void {}
    public function serverHeartbeatStarted(ServerHeartbeatStartedEvent $event): void {}
    public function serverHeartbeatSucceeded(ServerHeartbeatSucceededEvent $event): void {}
}

$manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
MongoDB\Driver\Monitoring\addSubscriber(new ServerChangeLogger());

// Beliebige Operationen ausführen – Topologie-Events werden automatisch ausgelöst
$command = new MongoDB\Driver\Command(['ping' => 1]);
$manager->executeCommand('admin', $command);
[SDAM] Server localhost:27017 wechselte von 'Unknown' zu 'Standalone'

Vorherigen und neuen Serverzustand vergleichen

<?php

use MongoDB\Driver\Monitoring\SDAMSubscriber;
use MongoDB\Driver\Monitoring\ServerChangedEvent;
use MongoDB\Driver\Monitoring\ServerClosedEvent;
use MongoDB\Driver\Monitoring\ServerOpeningEvent;
use MongoDB\Driver\Monitoring\TopologyChangedEvent;
use MongoDB\Driver\Monitoring\TopologyClosedEvent;
use MongoDB\Driver\Monitoring\TopologyOpeningEvent;
use MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent;
use MongoDB\Driver\Monitoring\ServerHeartbeatStartedEvent;
use MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent;

class DetailedServerMonitor implements SDAMSubscriber
{
    public function serverChanged(ServerChangedEvent $event): void
    {
        $prevDesc = $event->getPreviousDescription();
        $newDesc  = $event->getNewDescription();

        echo "=== ServerChangedEvent ===\n";
        echo "Topologie-ID : " . $event->getTopologyId() . "\n";
        echo "Host         : " . $event->getHost() . ":" . $event->getPort() . "\n";
        echo "Vorher       : " . $prevDesc->getType() . "\n";
        echo "Nachher      : " . $newDesc->getType() . "\n";

        // Auf Primär-Wechsel reagieren
        if ($newDesc->getType() === 'RSPrimary' && $prevDesc->getType() !== 'RSPrimary') {
            echo ">>> Neuer Primary erkannt – Failover oder Neustart wahrscheinlich!\n";
        }
    }

    public function serverClosed(ServerClosedEvent $event): void {}
    public function serverOpening(ServerOpeningEvent $event): void {}
    public function topologyChanged(TopologyChangedEvent $event): void {}
    public function topologyClosed(TopologyClosedEvent $event): void {}
    public function topologyOpening(TopologyOpeningEvent $event): void {}
    public function serverHeartbeatFailed(ServerHeartbeatFailedEvent $event): void {}
    public function serverHeartbeatStarted(ServerHeartbeatStartedEvent $event): void {}
    public function serverHeartbeatSucceeded(ServerHeartbeatSucceededEvent $event): void {}
}

$manager = new MongoDB\Driver\Manager('mongodb://localhost:27017/?replicaSet=rs0');
MongoDB\Driver\Monitoring\addSubscriber(new DetailedServerMonitor());

// Wichtig · Fallstricke

Nicht instanziierbar: ServerChangedEvent besitzt keinen öffentlichen Konstruktor. Objekte dieser Klasse werden ausschließlich intern vom PHP-Treiber erzeugt und an den Subscriber weitergereicht.

Erweiterbarkeit: Die Klasse ist als final deklariert und kann nicht abgeleitet werden.

Performance: SDAM-Subscriber werden synchron im Hintergrund-Monitoring-Thread aufgerufen. Aufwändige Operationen (z. B. Datenbankzugriffe oder blockierende I/O-Operationen) innerhalb der Callback-Methoden können das Monitoring verzögern und sollten vermieden oder asynchron ausgelagert werden.

Für eine vollständige SDAM-Implementierung muss das Interface MongoDB\Driver\Monitoring\SDAMSubscriber mit allen Pflichtmethoden implementiert werden.