Start · Sprachen · PHP · Referenz · Swoole\Connection\Iterator

Swoole\Connection\Iterator

Klasse

Ermöglicht die komfortable Iteration und den Zugriff auf alle aktiven Verbindungen eines <code>Swoole\Server</code>-Objekts.

seit PHP 1.9.0 Kategorie: misc

Signatur

class Swoole\Connection\Iterator implements Iterator, Countable, ArrayAccess

Beschreibung

Swoole\Connection\Iterator ist ein spezieller Iterator, der vom Swoole\Server zurückgegeben wird, wenn auf seine Verbindungen zugegriffen wird (z. B. über $server->connections). Er implementiert die Standard-PHP-Interfaces Iterator, Countable und ArrayAccess, sodass Verbindungslisten wie normale PHP-Arrays behandelt werden können.

Typischerweise wird dieser Iterator eingesetzt, um in einem Master- oder Worker-Prozess alle aktuell verbundenen Clients zu traversieren — etwa um Broadcast-Nachrichten an alle Verbindungen zu senden oder Statistiken über aktive Verbindungen zu sammeln.

Da Swoole asynchron und eventgetrieben arbeitet, kann sich die Menge der Verbindungen während der Iteration verändern. Es empfiehlt sich daher, innerhalb der Schleife defensiv zu programmieren (z. B. prüfen, ob eine Verbindung noch aktiv ist, bevor Daten gesendet werden). Der Zugriff über count($server->connections) liefert die aktuelle Anzahl aktiver Verbindungen.

Die Klasse steht nicht als eigenständiges Objekt zur Instantiierung bereit; sie wird intern von Swoole erzeugt und ausschließlich über die $server->connections-Eigenschaft genutzt.

Beispiele

Broadcast an alle aktiven Verbindungen senden

<?php
$server = new Swoole\Server('0.0.0.0', 9501);

$server->on('receive', function (Swoole\Server $server, int $fd, int $reactorId, string $data) {
    // Iteriere über alle aktiven Verbindungen und sende die Nachricht als Broadcast
    foreach ($server->connections as $connectionFd) {
        if ($server->exist($connectionFd)) {
            $server->send($connectionFd, "Broadcast: " . $data);
        }
    }
});

$server->start();

Anzahl aktiver Verbindungen ermitteln und einzelne Verbindungen prüfen

<?php
$server = new Swoole\Server('0.0.0.0', 9501);

$server->on('workerStart', function (Swoole\Server $server, int $workerId) {
    Swoole\Timer::tick(5000, function () use ($server) {
        // Anzahl aktiver Verbindungen ausgeben
        $count = count($server->connections);
        echo "Aktive Verbindungen: {$count}" . PHP_EOL;

        // Array-Zugriff auf eine bestimmte Verbindungs-FD prüfen
        $fd = 1;
        if (isset($server->connections[$fd])) {
            echo "Verbindung {$fd} ist aktiv." . PHP_EOL;
        }

        // Alle Verbindungs-FDs auflisten
        foreach ($server->connections as $connectionFd) {
            $info = $server->getClientInfo($connectionFd);
            if ($info !== false) {
                echo "FD {$connectionFd}: Remote-IP {$info['remote_ip']}" . PHP_EOL;
            }
        }
    });
});

$server->on('receive', function () {});
$server->start();

// Wichtig · Fallstricke

Vorsicht bei Nebenläufigkeit: Da Swoole-Verbindungen während der Iteration geschlossen werden können, sollte vor jedem send()-Aufruf mit $server->exist($fd) geprüft werden, ob die Verbindung noch besteht. Andernfalls können stille Fehler oder Warnungen auftreten.

Nur im Worker-Prozess verfügbar: Die $server->connections-Eigenschaft ist in Worker-Prozessen vollständig nutzbar. Im Task-Worker oder Manager-Prozess kann der Zugriff auf Verbindungsinformationen eingeschränkt sein.

Nicht manuell instantiierbar: Swoole\Connection\Iterator wird ausschließlich intern von Swoole erzeugt und sollte nicht direkt per new erstellt werden.