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

MongoDB\Driver\Monitoring\removeSubscriber

Funktion

Entfernt einen zuvor registrierten globalen Monitoring-Event-Abonnenten aus dem MongoDB-Treiber.

seit PHP 1.3.0 Kategorie: db

Signatur

MongoDB\Driver\Monitoring\removeSubscriber(MongoDB\Driver\Monitoring\Subscriber $subscriber): void

Beschreibung

MongoDB\Driver\Monitoring\removeSubscriber() hebt die Registrierung eines globalen Subscriber-Objekts auf, das zuvor mit MongoDB\Driver\Monitoring\addSubscriber() angemeldet wurde. Nach dem Entfernen empfängt der Abonnent keine weiteren Monitoring-Events mehr.

Die Funktion ist Teil des Application Performance Monitoring (APM) des offiziellen MongoDB PHP-Treibers. Sie ermöglicht es, globale Abonnenten gezielt wieder abzumelden – etwa am Ende einer Anfrage, beim Wechsel des Profiling-Kontexts oder in Unit-Tests, um Seiteneffekte zwischen Testfällen zu vermeiden.

Globale Abonnenten beziehen sich auf alle Manager-Instanzen, die in der aktuellen Laufzeit erstellt wurden. Neben globalen Abonnenten können auch Manager-spezifische Abonnenten über MongoDB\Driver\Manager::removeSubscriber() entfernt werden.

Wird ein Subscriber übergeben, der aktuell nicht registriert ist, löst die Funktion keine Ausnahme aus – sie hat schlicht keinen Effekt.

Parameter

Name Typ Default Beschreibung
$subscriber Pflicht MongoDB\Driver\Monitoring\Subscriber Das Subscriber-Objekt, das aus der globalen Liste der Monitoring-Abonnenten entfernt werden soll. Das Objekt muss zuvor mit MongoDB\Driver\Monitoring\addSubscriber() registriert worden sein.

Rückgabewert

Typ
void
Beschreibung
Die Funktion gibt keinen Wert zurück.

Beispiele

Globalen Command-Monitoring-Abonnenten entfernen

<?php
use MongoDB\Driver\Monitoring\CommandSubscriber;
use MongoDB\Driver\Monitoring\CommandStartedEvent;
use MongoDB\Driver\Monitoring\CommandSucceededEvent;
use MongoDB\Driver\Monitoring\CommandFailedEvent;

class MyCommandLogger implements CommandSubscriber
{
    public array $log = [];

    public function commandStarted(CommandStartedEvent $event): void
    {
        $this->log[] = 'Started: ' . $event->getCommandName();
    }

    public function commandSucceeded(CommandSucceededEvent $event): void
    {
        $this->log[] = 'Succeeded: ' . $event->getCommandName();
    }

    public function commandFailed(CommandFailedEvent $event): void
    {
        $this->log[] = 'Failed: ' . $event->getCommandName();
    }
}

$logger = new MyCommandLogger();

// Abonnenten global registrieren
MongoDB\Driver\Monitoring\addSubscriber($logger);

$manager = new MongoDB\Driver\Manager('mongodb://127.0.0.1/');
$query   = new MongoDB\Driver\Query([]);
$manager->executeQuery('testdb.users', $query);

// Abonnenten wieder entfernen
MongoDB\Driver\Monitoring\removeSubscriber($logger);

// Weitere Abfragen werden NICHT mehr geloggt
$manager->executeQuery('testdb.users', $query);

print_r($logger->log);
Array ( [0] => Started: find [1] => Succeeded: find )

Abonnenten in PHPUnit-Tests sauber aufräumen

<?php
use MongoDB\Driver\Monitoring\CommandSubscriber;
use MongoDB\Driver\Monitoring\CommandStartedEvent;
use MongoDB\Driver\Monitoring\CommandSucceededEvent;
use MongoDB\Driver\Monitoring\CommandFailedEvent;
use PHPUnit\Framework\TestCase;

class MyCommandLogger implements CommandSubscriber
{
    public int $count = 0;

    public function commandStarted(CommandStartedEvent $event): void  { $this->count++; }
    public function commandSucceeded(CommandSucceededEvent $event): void {}
    public function commandFailed(CommandFailedEvent $event): void {}
}

class MongoDbTest extends TestCase
{
    private MyCommandLogger $logger;

    protected function setUp(): void
    {
        $this->logger = new MyCommandLogger();
        MongoDB\Driver\Monitoring\addSubscriber($this->logger);
    }

    protected function tearDown(): void
    {
        // Sicherstellen, dass der Abonnent nach jedem Test entfernt wird
        MongoDB\Driver\Monitoring\removeSubscriber($this->logger);
    }

    public function testCommandCount(): void
    {
        $manager = new MongoDB\Driver\Manager('mongodb://127.0.0.1/');
        $manager->executeQuery('testdb.col', new MongoDB\Driver\Query([]));
        $this->assertGreaterThan(0, $this->logger->count);
    }
}

// Wichtig · Fallstricke

Nicht registrierter Subscriber: Wird ein Subscriber übergeben, der nicht in der globalen Liste vorhanden ist, passiert nichts – es wird keine Ausnahme geworfen. Dies gilt sowohl für nie registrierte als auch für bereits entfernte Abonnenten.

Globale vs. Manager-spezifische Abonnenten: Diese Funktion betrifft ausschließlich global registrierte Abonnenten. Um einen Abonnenten nur für eine bestimmte Manager-Instanz zu entfernen, verwende MongoDB\Driver\Manager::removeSubscriber().

Speicherverwaltung: Nach dem Entfernen hält der Treiber keine interne Referenz mehr auf das Subscriber-Objekt. Das Objekt kann dann vom Garbage Collector freigegeben werden, sofern keine weiteren Referenzen im Userland existieren.