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

MongoDB\Driver\Monitoring\TopologyOpeningEvent

Klasse

Repräsentiert ein Ereignis, das ausgelöst wird, wenn eine neue Server-Topologie im MongoDB-Treiber geöffnet wird.

seit PHP 1.3.0 Kategorie: db

Signatur

class MongoDB\Driver\Monitoring\TopologyOpeningEvent

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 geöffnet: <ObjectId der Topologie>

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
Neue Topologie registriert: <ObjectId> Topologie <ObjectId> geschlossen nach 0.0012 Sekunden

// 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.