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

MongoDB\Driver\Monitoring\ServerClosedEvent

Klasse

Repräsentiert ein Ereignis, das ausgelöst wird, wenn ein Server aus dem Topology des MongoDB-Treibers entfernt wird.

seit PHP 1.3.0 Kategorie: db

Signatur

class MongoDB\Driver\Monitoring\ServerClosedEvent

Beschreibung

MongoDB\Driver\Monitoring\ServerClosedEvent ist eine schreibgeschützte Ereignisklasse, die vom MongoDB-PHP-Treiber im Rahmen des Server Discovery and Monitoring (SDAM)-Protokolls erzeugt wird. Das Ereignis wird ausgelöst, sobald ein Server aus der internen Topologie-Beschreibung des Treibers entfernt wird – beispielsweise wenn die Verbindung zu einem Mitglied eines Replica Sets verloren geht oder ein Mongos-Server nicht mehr erreichbar ist.

Um dieses Ereignis zu empfangen, muss ein Subscriber-Objekt implementiert werden, das das Interface MongoDB\Driver\Monitoring\SDAMSubscriber implementiert. Die Methode serverClosed() des Subscribers erhält eine Instanz dieser Klasse als Argument. Der Subscriber wird dann über MongoDB\Driver\Monitoring\addSubscriber() registriert.

Die Klasse stellt Methoden bereit, um die ID der betroffenen Topologie sowie den Hostnamen und Port des geschlossenen Servers abzufragen. Instanzen dieser Klasse können nicht manuell erstellt werden – sie werden ausschließlich vom Treiber intern erzeugt.

Typische Anwendungsfälle sind das Logging von Verbindungsänderungen, das Monitoring der Cluster-Stabilität oder das Auslösen von Alarmen, wenn Server unerwartet aus der Topologie entfernt werden.

Beispiele

ServerClosedEvent über einen SDAMSubscriber empfangen

<?php

use MongoDB\Driver\Monitoring\SDAMSubscriber;
use MongoDB\Driver\Monitoring\ServerClosedEvent;
use MongoDB\Driver\Monitoring\ServerDescriptionChangedEvent;
use MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent;
use MongoDB\Driver\Monitoring\ServerHeartbeatStartedEvent;
use MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent;
use MongoDB\Driver\Monitoring\ServerOpeningEvent;
use MongoDB\Driver\Monitoring\TopologyChangedEvent;
use MongoDB\Driver\Monitoring\TopologyClosedEvent;
use MongoDB\Driver\Monitoring\TopologyOpeningEvent;

class MyMonitoringSubscriber implements SDAMSubscriber
{
    public function serverClosed(ServerClosedEvent $event): void
    {
        printf(
            "Server geschlossen: %s:%d (Topology-ID: %s)\n",
            $event->getHost(),
            $event->getPort(),
            $event->getTopologyId()
        );
    }

    public function serverDescriptionChanged(ServerDescriptionChangedEvent $event): void {}
    public function serverHeartbeatFailed(ServerHeartbeatFailedEvent $event): void {}
    public function serverHeartbeatStarted(ServerHeartbeatStartedEvent $event): void {}
    public function serverHeartbeatSucceeded(ServerHeartbeatSucceededEvent $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 {}
}

$subscriber = new MyMonitoringSubscriber();
MongoDB\Driver\Monitoring\addSubscriber($subscriber);

$manager = new MongoDB\Driver\Manager('mongodb://127.0.0.1/');

// Alle Operationen auslösen, damit der Treiber die Topologie aufbaut
$manager->executeCommand('admin', new MongoDB\Driver\Command(['ping' => 1]));

// Verbindung beenden und Subscriber wieder entfernen
MongoDB\Driver\Monitoring\removeSubscriber($subscriber);
Server geschlossen: 127.0.0.1:27017 (Topology-ID: 64a1f2e3c0a1234567890abc)

Topology-ID und Server-Adresse aus dem Ereignis auslesen

<?php

use MongoDB\Driver\Monitoring\SDAMSubscriber;
use MongoDB\Driver\Monitoring\ServerClosedEvent;

class LoggingSubscriber implements SDAMSubscriber
{
    private array $log = [];

    public function serverClosed(ServerClosedEvent $event): void
    {
        $this->log[] = [
            'topology_id' => (string) $event->getTopologyId(),
            'host'        => $event->getHost(),
            'port'        => $event->getPort(),
            'timestamp'   => date('Y-m-d H:i:s'),
        ];
    }

    public function getLog(): array
    {
        return $this->log;
    }

    // Alle weiteren Interface-Methoden als leere Stubs ...
    public function serverDescriptionChanged(\MongoDB\Driver\Monitoring\ServerDescriptionChangedEvent $event): void {}
    public function serverHeartbeatFailed(\MongoDB\Driver\Monitoring\ServerHeartbeatFailedEvent $event): void {}
    public function serverHeartbeatStarted(\MongoDB\Driver\Monitoring\ServerHeartbeatStartedEvent $event): void {}
    public function serverHeartbeatSucceeded(\MongoDB\Driver\Monitoring\ServerHeartbeatSucceededEvent $event): void {}
    public function serverOpening(\MongoDB\Driver\Monitoring\ServerOpeningEvent $event): void {}
    public function topologyChanged(\MongoDB\Driver\Monitoring\TopologyChangedEvent $event): void {}
    public function topologyClosed(\MongoDB\Driver\Monitoring\TopologyClosedEvent $event): void {}
    public function topologyOpening(\MongoDB\Driver\Monitoring\TopologyOpeningEvent $event): void {}
}

$subscriber = new LoggingSubscriber();
MongoDB\Driver\Monitoring\addSubscriber($subscriber);

$manager = new MongoDB\Driver\Manager('mongodb://127.0.0.1/');
$manager->executeCommand('admin', new MongoDB\Driver\Command(['ping' => 1]));

Mongodb\Driver\Monitoring\removeSubscriber($subscriber);

foreach ($subscriber->getLog() as $entry) {
    echo "[{$entry['timestamp']}] Server {$entry['host']}:{$entry['port']} geschlossen.\n";
}
[2024-07-01 12:00:00] Server 127.0.0.1:27017 geschlossen.

// Wichtig · Fallstricke

Keine manuelle Instanziierung: Objekte vom Typ ServerClosedEvent können nicht per new erzeugt werden. Der Treiber erstellt sie intern und übergibt sie an den registrierten Subscriber.

Abhängigkeit von der PECL-Erweiterung: Diese Klasse ist Teil der mongodb-PECL-Erweiterung (nicht der veralteten mongo-Erweiterung) und erfordert mindestens Version 1.3.0 der Erweiterung.

Reihenfolge der Ereignisse: Einem ServerClosedEvent geht in der Regel ein ServerDescriptionChangedEvent voraus, das den Zustandswechsel des Servers dokumentiert. Das ServerClosedEvent wird erst ausgelöst, wenn der Server vollständig aus der Topologie entfernt wurde.