Signatur
Beschreibung
Die Klasse MongoDB\Driver\Monitoring\TopologyOpeningEvent kapselt alle Informationen, die beim Öffnen einer neuen Server-Topologie durch den MongoDB PHP-Treiber anfallen. Sie ist Teil des SDAM-Monitorings (Server Discovery and Monitoring) und ermöglicht es, den Lebenszyklus von Verbindungstopologien nachzuverfolgen.
Objekte dieser Klasse werden vom Treiber automatisch erzeugt und an registrierte Subscriber-Objekte übergeben, die das Interface MongoDB\Driver\Monitoring\SDAMSubscriber implementieren. Die Methode topologyOpening() des Subscribers empfängt das Ereignis, sobald eine neue Topologie initialisiert wird – beispielsweise beim ersten Verbindungsaufbau.
Ein typischer Anwendungsfall ist das Logging oder Monitoring von Topologiewechseln in verteilten MongoDB-Deployments (z. B. Replica Sets, Sharded Clusters). Mithilfe der Topologie-ID kann man zusammengehörige Monitoring-Ereignisse eindeutig zuordnen.
Da Instanzen dieser Klasse ausschließlich intern vom Treiber erstellt werden, verfügt die Klasse über keinen öffentlichen Konstruktor. Der Zugriff erfolgt ausschließlich über die bereitgestellten Getter-Methoden.
Beispiele
Topology-Opening-Ereignis mit einem SDAM-Subscriber erfassen
<?php
use MongoDB\Driver\Monitoring\SDAMSubscriber;
use MongoDB\Driver\Monitoring\TopologyOpeningEvent;
use MongoDB\Driver\Monitoring\TopologyClosedEvent;
use MongoDB\Driver\Monitoring\TopologyChangedEvent;
use MongoDB\Driver\Monitoring\ServerOpeningEvent;
use MongoDB\Driver\Monitoring\ServerClosedEvent;
use MongoDB\Driver\Monitoring\ServerChangedEvent;
use MongoDB\Driver\Monitoring\ServerHeartbeatStartedEvent;
use MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent;
use MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent;
class MySDAMSubscriber implements SDAMSubscriber
{
public function topologyOpening(TopologyOpeningEvent $event): void
{
echo "Topologie geöffnet: " . $event->getTopologyId() . PHP_EOL;
}
public function topologyClosed(TopologyClosedEvent $event): void {}
public function topologyChanged(TopologyChangedEvent $event): void {}
public function serverOpening(ServerOpeningEvent $event): void {}
public function serverClosed(ServerClosedEvent $event): void {}
public function serverChanged(ServerChangedEvent $event): void {}
public function serverHeartbeatStarted(ServerHeartbeatStartedEvent $event): void {}
public function serverHeartbeatSucceeded(ServerHeartbeatSucceededEvent $event): void {}
public function serverHeartbeatFailed(ServerHeartbeatFailedEvent $event): void {}
}
$subscriber = new MySDAMSubscriber();
MongoDB\Driver\Monitoring\addSubscriber($subscriber);
$manager = new MongoDB\Driver\Manager('mongodb://127.0.0.1/');
// Beim Anlegen des Managers wird topologyOpening() automatisch aufgerufen
Topologie-ID zur Korrelation von Ereignissen nutzen
<?php
use MongoDB\Driver\Monitoring\SDAMSubscriber;
use MongoDB\Driver\Monitoring\TopologyOpeningEvent;
use MongoDB\Driver\Monitoring\TopologyClosedEvent;
use MongoDB\Driver\Monitoring\TopologyChangedEvent;
use MongoDB\Driver\Monitoring\ServerOpeningEvent;
use MongoDB\Driver\Monitoring\ServerClosedEvent;
use MongoDB\Driver\Monitoring\ServerChangedEvent;
use MongoDB\Driver\Monitoring\ServerHeartbeatStartedEvent;
use MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent;
use MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent;
class CorrelatingSubscriber implements SDAMSubscriber
{
private array $topologies = [];
public function topologyOpening(TopologyOpeningEvent $event): void
{
$id = (string) $event->getTopologyId();
$this->topologies[$id] = ['opened_at' => microtime(true)];
echo "Neue Topologie registriert: {$id}" . PHP_EOL;
}
public function topologyClosed(TopologyClosedEvent $event): void
{
$id = (string) $event->getTopologyId();
if (isset($this->topologies[$id])) {
$duration = microtime(true) - $this->topologies[$id]['opened_at'];
echo sprintf("Topologie %s geschlossen nach %.4f Sekunden", $id, $duration) . PHP_EOL;
unset($this->topologies[$id]);
}
}
public function topologyChanged(TopologyChangedEvent $event): void {}
public function serverOpening(ServerOpeningEvent $event): void {}
public function serverClosed(ServerClosedEvent $event): void {}
public function serverChanged(ServerChangedEvent $event): void {}
public function serverHeartbeatStarted(ServerHeartbeatStartedEvent $event): void {}
public function serverHeartbeatSucceeded(ServerHeartbeatSucceededEvent $event): void {}
public function serverHeartbeatFailed(ServerHeartbeatFailedEvent $event): void {}
}
$subscriber = new CorrelatingSubscriber();
MongoDB\Driver\Monitoring\addSubscriber($subscriber);
$manager = new MongoDB\Driver\Manager('mongodb://127.0.0.1/');
unset($manager); // Schließt die Topologie und löst topologyClosed() aus
// Wichtig · Fallstricke
Kein öffentlicher Konstruktor: Instanzen von TopologyOpeningEvent können nicht manuell erstellt werden. Sie werden ausschließlich vom Treiber intern erzeugt und an registrierte Subscriber übergeben.
Methode: Die einzige öffentliche Methode ist getTopologyId(), die ein MongoDB\BSON\ObjectId-Objekt zurückgibt, das die Topologie eindeutig identifiziert. Diese ID bleibt für alle SDAM-Ereignisse der gleichen Topologie konstant und eignet sich daher zur Korrelation zusammengehöriger Ereignisse.
Subscriber-Registrierung: Subscriber müssen vor dem Erstellen des MongoDB\Driver\Manager registriert werden, da das topologyOpening-Ereignis beim Anlegen des Managers ausgelöst wird. Eine spätere Registrierung führt dazu, dass dieses initiale Ereignis verpasst wird.