Start · Sprachen · PHP · Referenz · MongoDB\Driver\Server

MongoDB\Driver\Server

Klasse

Repräsentiert eine Verbindung zu einem einzelnen MongoDB-Server und stellt Methoden zur Ausführung von Operationen sowie zur Abfrage von Server-Metadaten bereit.

seit PHP 1.0.0 Kategorie: db

Signatur

class MongoDB\Driver\Server

Beschreibung

Die Klasse MongoDB\Driver\Server ist Teil der offiziellen MongoDB-PHP-Extension (ext-mongodb) und kapselt die Verbindung zu einem einzelnen MongoDB-Knoten – sei es ein Standalone-Server, ein Mitglied eines Replica-Sets oder ein Mongos-Router in einem Sharded Cluster. Instanzen dieser Klasse können nicht direkt erzeugt werden; sie werden ausschließlich vom Treiber intern erstellt und über Methoden wie MongoDB\Driver\Manager::selectServer() oder MongoDB\Driver\Manager::getServers() zurückgegeben.

Über ein Server-Objekt können Befehle (executeCommand()), lesende Abfragen (executeQuery()) sowie schreibende Operationen (executeBulkWrite()) direkt an den betreffenden Server gesendet werden, ohne dass der Treiber erneut einen Server auswählen muss. Dies ist besonders nützlich, wenn gezielt auf einem bestimmten Replica-Set-Mitglied oder einem bestimmten Shard gearbeitet werden soll.

Zusätzlich bietet die Klasse eine Vielzahl von Metadaten-Methoden: getHost(), getPort(), getType(), getLatency() und getInfo() liefern Informationen über den Server, seinen Typ (Primary, Secondary, Arbiter, Mongos usw.) und seine Leistungscharakteristik. Mit isReadable() und isWritable() lässt sich prüfen, ob ein Server aktuell für Lese- bzw. Schreiboperationen geeignet ist.

Da Server-Objekte einen Schnappschuss des Serverzustands zu einem bestimmten Zeitpunkt darstellen, können sich Eigenschaften wie Latenz oder Typ nach einem Server-Failover oder Topology-Wechsel geändert haben. Es empfiehlt sich, Server-Objekte nicht langfristig zu cachen, sondern bei Bedarf erneut über den Manager abzurufen.

Beispiele

Server-Metadaten abfragen

<?php
use MongoDB\Driver\Manager;
use MongoDB\Driver\ReadPreference;

$manager = new Manager('mongodb://localhost:27017');

// Einen geeigneten Server für Lesezugriffe auswählen
$server = $manager->selectServer(new ReadPreference(ReadPreference::PRIMARY));

echo 'Host: ' . $server->getHost() . PHP_EOL;
echo 'Port: ' . $server->getPort() . PHP_EOL;
echo 'Latenz (ms): ' . $server->getLatency() . PHP_EOL;
echo 'Typ: ' . $server->getType() . PHP_EOL;
echo 'Schreibbar: ' . ($server->isWritable() ? 'Ja' : 'Nein') . PHP_EOL;
echo 'Lesbar: '    . ($server->isReadable() ? 'Ja' : 'Nein') . PHP_EOL;
Host: localhost Port: 27017 Latenz (ms): 1 Typ: 1 Schreibbar: Ja Lesbar: Ja

Befehl direkt über ein Server-Objekt ausführen

<?php
use MongoDB\Driver\Manager;
use MongoDB\Driver\Command;
use MongoDB\Driver\ReadPreference;

$manager = new Manager('mongodb://localhost:27017');
$server  = $manager->selectServer(new ReadPreference(ReadPreference::PRIMARY));

// Datenbankstatistiken direkt auf dem ausgewählten Server abfragen
$command = new Command(['dbStats' => 1]);
$cursor  = $server->executeCommand('myDatabase', $command);

foreach ($cursor as $result) {
    echo 'Datenbank: ' . $result->db . PHP_EOL;
    echo 'Collections: ' . $result->collections . PHP_EOL;
    echo 'Objekte: ' . $result->objects . PHP_EOL;
}
Datenbank: myDatabase Collections: 5 Objekte: 1234

Alle verbundenen Server eines Replica-Sets auflisten

<?php
use MongoDB\Driver\Manager;

$manager = new Manager('mongodb://rs0-primary:27017,rs0-secondary:27018/?replicaSet=rs0');

// Kurzes Warmup damit der Treiber die Topologie ermittelt hat
foreach ($manager->getServers() as $server) {
    $typeLabels = [
        MongoDB\Driver\Server::TYPE_UNKNOWN           => 'Unbekannt',
        MongoDB\Driver\Server::TYPE_STANDALONE        => 'Standalone',
        MongoDB\Driver\Server::TYPE_MONGOS            => 'Mongos',
        MongoDB\Driver\Server::TYPE_POSSIBLE_PRIMARY  => 'Möglicher Primary',
        MongoDB\Driver\Server::TYPE_RS_PRIMARY        => 'RS Primary',
        MongoDB\Driver\Server::TYPE_RS_SECONDARY      => 'RS Secondary',
        MongoDB\Driver\Server::TYPE_RS_ARBITER        => 'RS Arbiter',
        MongoDB\Driver\Server::TYPE_RS_OTHER          => 'RS Sonstiges',
        MongoDB\Driver\Server::TYPE_RS_GHOST          => 'RS Ghost',
    ];

    $type = $typeLabels[$server->getType()] ?? 'Unbekannt';
    printf("%s:%d  Typ: %-15s  Latenz: %d ms\n",
        $server->getHost(),
        $server->getPort(),
        $type,
        (int) $server->getLatency()
    );
}
rs0-primary:27017 Typ: RS Primary Latenz: 1 ms rs0-secondary:27018 Typ: RS Secondary Latenz: 2 ms

// Wichtig · Fallstricke

Nicht instanziierbar: MongoDB\Driver\Server-Objekte können nicht mit new erzeugt werden. Sie stammen ausschließlich aus Treiber-internen Quellen wie Manager::selectServer() oder Manager::getServers().

Schnappschuss-Semantik: Ein Server-Objekt spiegelt den Zustand des Servers zum Zeitpunkt seiner Erstellung wider. Nach einem Failover oder Topologie-Wechsel kann das Objekt veraltet sein. Server-Objekte sollten daher nicht dauerhaft gecacht werden.

Typen-Konstanten: Der Rückgabewert von getType() entspricht einer der Klassenkonstanten TYPE_UNKNOWN, TYPE_STANDALONE, TYPE_MONGOS, TYPE_RS_PRIMARY, TYPE_RS_SECONDARY, TYPE_RS_ARBITER, TYPE_RS_OTHER, TYPE_RS_GHOST und TYPE_POSSIBLE_PRIMARY.

Direkte Server-Ausführung: Das direkte Ausführen von Operationen über ein Server-Objekt (anstatt über den Manager) umgeht die automatische Server-Auswahl des Treibers. Dies ist für fortgeschrittene Szenarien gedacht; im Normalfall sollte man Operationen über den Manager ausführen.