Signatur
Beschreibung
Die Klasse MongoDB\Driver\Monitoring\TopologyClosedEvent ist Teil des SDAM-Monitoring-Systems (Server Discovery and Monitoring) des MongoDB PHP-Treibers. Ein Objekt dieser Klasse wird an registrierte Subscriber übergeben, sobald eine bestehende Verbindungs-Topologie vollständig geschlossen wird – typischerweise wenn das zugehörige MongoDB\Driver\Manager-Objekt zerstört wird.
Dieses Ereignis ist nützlich, um den Lebenszyklus von Topologie-Verbindungen zu überwachen, Ressourcen freizugeben, Metriken zu erfassen oder Diagnose-Logs beim Beenden einer Verbindung zu schreiben. Es ergänzt das Gegenstück MongoDB\Driver\Monitoring\TopologyOpeningEvent, das beim Öffnen ausgelöst wird.
Um dieses Ereignis zu empfangen, muss ein Subscriber das Interface MongoDB\Driver\Monitoring\SDAMSubscriber implementieren und die Methode topologyClosed(TopologyClosedEvent $event) definieren. Der Subscriber wird anschließend über MongoDB\Driver\Monitoring\addSubscriber() registriert.
Objekte dieser Klasse können nicht direkt instanziiert werden – sie werden ausschließlich intern vom Treiber erzeugt und an die entsprechende Subscriber-Methode weitergereicht.
Beispiele
Topologie-Schließen mit einem SDAMSubscriber überwachen
<?php
use MongoDB\Driver\Manager;
use MongoDB\Driver\Monitoring\SDAMSubscriber;
use MongoDB\Driver\Monitoring\TopologyOpeningEvent;
use MongoDB\Driver\Monitoring\TopologyDescriptionChangedEvent;
use MongoDB\Driver\Monitoring\TopologyClosedEvent;
use MongoDB\Driver\Monitoring\ServerOpeningEvent;
use MongoDB\Driver\Monitoring\ServerClosedEvent;
use MongoDB\Driver\Monitoring\ServerDescriptionChangedEvent;
use MongoDB\Driver\Monitoring\ServerHeartbeatStartedEvent;
use MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent;
use MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent;
class MyTopologySubscriber implements SDAMSubscriber
{
public function topologyOpening(TopologyOpeningEvent $event): void
{
echo 'Topologie geöffnet: ' . $event->getTopologyId() . PHP_EOL;
}
public function topologyClosed(TopologyClosedEvent $event): void
{
echo 'Topologie geschlossen: ' . $event->getTopologyId() . PHP_EOL;
}
public function topologyChanged(TopologyDescriptionChangedEvent $event): void {}
public function serverOpening(ServerOpeningEvent $event): void {}
public function serverClosed(ServerClosedEvent $event): void {}
public function serverChanged(ServerDescriptionChangedEvent $event): void {}
public function serverHeartbeatStarted(ServerHeartbeatStartedEvent $event): void {}
public function serverHeartbeatSucceeded(ServerHeartbeatSucceededEvent $event): void {}
public function serverHeartbeatFailed(ServerHeartbeatFailedEvent $event): void {}
}
$subscriber = new MyTopologySubscriber();
MongoDB\Driver\Monitoring\addSubscriber($subscriber);
$manager = new Manager('mongodb://127.0.0.1/');
// Manager wird am Ende des Scopes zerstört → löst TopologyClosedEvent aus
unset($manager);
Topologie-ID beim Schließen protokollieren
<?php
use MongoDB\Driver\Monitoring\SDAMSubscriber;
use MongoDB\Driver\Monitoring\TopologyClosedEvent;
use MongoDB\Driver\Monitoring\TopologyOpeningEvent;
use MongoDB\Driver\Monitoring\TopologyDescriptionChangedEvent;
use MongoDB\Driver\Monitoring\ServerOpeningEvent;
use MongoDB\Driver\Monitoring\ServerClosedEvent;
use MongoDB\Driver\Monitoring\ServerDescriptionChangedEvent;
use MongoDB\Driver\Monitoring\ServerHeartbeatStartedEvent;
use MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent;
use MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent;
class LoggingSubscriber implements SDAMSubscriber
{
private array $log = [];
public function topologyClosed(TopologyClosedEvent $event): void
{
$topologyId = (string) $event->getTopologyId();
$this->log[] = sprintf(
'[%s] Topologie %s wurde geschlossen.',
date('Y-m-d H:i:s'),
$topologyId
);
echo end($this->log) . PHP_EOL;
}
public function getLog(): array { return $this->log; }
public function topologyOpening(TopologyOpeningEvent $event): void {}
public function topologyChanged(TopologyDescriptionChangedEvent $event): void {}
public function serverOpening(ServerOpeningEvent $event): void {}
public function serverClosed(ServerClosedEvent $event): void {}
public function serverChanged(ServerDescriptionChangedEvent $event): void {}
public function serverHeartbeatStarted(ServerHeartbeatStartedEvent $event): void {}
public function serverHeartbeatSucceeded(ServerHeartbeatSucceededEvent $event): void {}
public function serverHeartbeatFailed(ServerHeartbeatFailedEvent $event): void {}
}
$subscriber = new LoggingSubscriber();
MongoDB\Driver\Monitoring\addSubscriber($subscriber);
$manager = new MongoDB\Driver\Manager('mongodb://127.0.0.1/');
unset($manager);
print_r($subscriber->getLog());
// Wichtig · Fallstricke
Nicht instanziierbar: Objekte von TopologyClosedEvent können nicht manuell mit new erstellt werden. Sie werden ausschließlich intern vom MongoDB PHP-Treiber erzeugt.
Einzige Methode: Die Klasse stellt lediglich die Methode getTopologyId() bereit, die ein MongoDB\BSON\ObjectId-Objekt zurückgibt, das die Topologie eindeutig identifiziert.
Lebenszyklus: Das Ereignis wird ausgelöst, wenn der Manager explizit mit unset() zerstört wird oder der PHP-Prozess endet. In lang laufenden Prozessen (z. B. Daemons) ist dies besonders relevant für sauberes Ressourcenmanagement.