Signatur
Beschreibung
Die Klasse MongoDB\Driver\Monitoring\ServerOpeningEvent ist Teil des SDAM-Monitorings (Server Discovery and Monitoring) im offiziellen MongoDB-PHP-Treiber. Eine Instanz dieser Klasse wird an die Methode serverOpening() eines registrierten MongoDB\Driver\Monitoring\SDAMSubscriber-Objekts übergeben, wenn der Treiber erstmals eine Verbindung zu einem MongoDB-Server herstellt.
Das Ereignis enthält Informationen über den betroffenen Server (Hostname und Port) sowie die Topologie-ID, zu der der Server gehört. Es eignet sich besonders für Logging, Diagnose und das Nachverfolgen von Verbindungslebenszyklen in komplexen Replikatsatz- oder Sharded-Cluster-Umgebungen.
Die Klasse kann nicht instanziiert werden – Objekte davon werden ausschließlich intern vom Treiber erstellt und an registrierte Abonnenten weitergegeben. Um dieses Ereignis zu empfangen, muss eine Klasse das Interface MongoDB\Driver\Monitoring\SDAMSubscriber implementieren und über MongoDB\Driver\Monitoring\addSubscriber() registriert werden.
Beispiele
Server-Opening-Ereignisse mit einem SDAMSubscriber protokollieren
<?php
use MongoDB\Driver\Monitoring\SDAMSubscriber;
use MongoDB\Driver\Monitoring\ServerOpeningEvent;
use MongoDB\Driver\Monitoring\ServerClosedEvent;
use MongoDB\Driver\Monitoring\ServerDescriptionChangedEvent;
use MongoDB\Driver\Monitoring\TopologyOpeningEvent;
use MongoDB\Driver\Monitoring\TopologyClosedEvent;
use MongoDB\Driver\Monitoring\TopologyDescriptionChangedEvent;
use MongoDB\Driver\Monitoring\ServerHeartbeatStartedEvent;
use MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent;
use MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent;
class ServerLogger implements SDAMSubscriber
{
public function serverOpening(ServerOpeningEvent $event): void
{
printf(
"[%s] Server wird geöffnet: %s:%d (Topologie: %s)\n",
date('H:i:s'),
$event->getHost(),
$event->getPort(),
(string) $event->getTopologyId()
);
}
public function serverClosed(ServerClosedEvent $event): void {}
public function serverDescriptionChanged(ServerDescriptionChangedEvent $event): void {}
public function topologyOpening(TopologyOpeningEvent $event): void {}
public function topologyClosed(TopologyClosedEvent $event): void {}
public function topologyDescriptionChanged(TopologyDescriptionChangedEvent $event): void {}
public function serverHeartbeatStarted(ServerHeartbeatStartedEvent $event): void {}
public function serverHeartbeatSucceeded(ServerHeartbeatSucceededEvent $event): void {}
public function serverHeartbeatFailed(ServerHeartbeatFailedEvent $event): void {}
}
$logger = new ServerLogger();
MongoDB\Driver\Monitoring\addSubscriber($logger);
$manager = new MongoDB\Driver\Manager('mongodb://127.0.0.1:27017');
// Eine einfache Abfrage auslösen, damit die Verbindung tatsächlich geöffnet wird
$query = new MongoDB\Driver\Query([]);
$cursor = $manager->executeQuery('testdb.col', $query);
MongoDB\Driver\Monitoring\removeSubscriber($logger);
Topologie-ID und Host-Informationen auslesen
<?php
use MongoDB\Driver\Monitoring\SDAMSubscriber;
use MongoDB\Driver\Monitoring\ServerOpeningEvent;
class MinimalLogger implements SDAMSubscriber
{
private array $openedServers = [];
public function serverOpening(ServerOpeningEvent $event): void
{
$key = $event->getHost() . ':' . $event->getPort();
$this->openedServers[$key] = [
'host' => $event->getHost(),
'port' => $event->getPort(),
'topologyId' => (string) $event->getTopologyId(),
'time' => microtime(true),
];
}
public function getOpenedServers(): array
{
return $this->openedServers;
}
// Restliche SDAMSubscriber-Methoden (leer)
public function serverClosed(\MongoDB\Driver\Monitoring\ServerClosedEvent $e): void {}
public function serverDescriptionChanged(\MongoDB\Driver\Monitoring\ServerDescriptionChangedEvent $e): void {}
public function topologyOpening(\MongoDB\Driver\Monitoring\TopologyOpeningEvent $e): void {}
public function topologyClosed(\MongoDB\Driver\Monitoring\TopologyClosedEvent $e): void {}
public function topologyDescriptionChanged(\MongoDB\Driver\Monitoring\TopologyDescriptionChangedEvent $e): void {}
public function serverHeartbeatStarted(\MongoDB\Driver\Monitoring\ServerHeartbeatStartedEvent $e): void {}
public function serverHeartbeatSucceeded(\MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent $e): void {}
public function serverHeartbeatFailed(\MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent $e): void {}
}
$logger = new MinimalLogger();
MongoDB\Driver\Monitoring\addSubscriber($logger);
new MongoDB\Driver\Manager('mongodb://127.0.0.1:27017');
print_r($logger->getOpenedServers());
// Wichtig · Fallstricke
Nicht instanziierbar: MongoDB\Driver\Monitoring\ServerOpeningEvent besitzt keinen öffentlichen Konstruktor. Instanzen werden ausschließlich intern vom Treiber erzeugt und an SDAMSubscriber::serverOpening() übergeben.
Verfügbare Methoden: Das Ereignis stellt folgende Getter bereit: getHost(): string, getPort(): int und getTopologyId(): MongoDB\BSON\ObjectId.
Abonnementen-Lebensdauer: Über MongoDB\Driver\Monitoring\addSubscriber() global registrierte Abonnenten werden für alle danach erstellten Manager-Instanzen aktiv. Alternativ kann ein Abonnent direkt am Manager registriert werden, um nur dessen Ereignisse zu empfangen.