Signatur
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
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);
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.