Signatur
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 ÄnderunggetNewDescription()– liefert den Serverzustand nach der ÄnderunggetTopologyId()– liefert die ID der betroffenen TopologiegetPort()– liefert den Port des betroffenen ServersgetHost()– 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);
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.