Start · Sprachen · PHP · Referenz · Swoole\Server\Port

Swoole\Server\Port

Klasse

Repräsentiert einen zusätzlichen Listening-Port eines <code>Swoole\Server</code>-Objekts und ermöglicht portspezifische Konfiguration und Event-Callbacks.

seit PHP 4.0.0 Kategorie: misc

Signatur

class Swoole\Server\Port

Beschreibung

Swoole\Server\Port wird zurückgegeben, wenn einem laufenden oder konfigurierten Swoole\Server über die Methode listen() ein weiterer Port hinzugefügt wird. Jedes Port-Objekt repräsentiert genau einen TCP- oder UDP-Listening-Endpunkt und kann unabhängig mit eigenen Einstellungen (set()) und eigenen Event-Callbacks (on()) ausgestattet werden.

Typische Anwendungsfälle sind Multi-Protokoll-Server: Ein Hauptserver lauscht z. B. auf Port 9501 für HTTP-Requests, während ein über listen() erzeugtes Port-Objekt auf Port 9502 ein eigenes Binärprotokoll bedient. Die Protokolltrennung macht den Code übersichtlicher und vermeidet Kollisionen bei der Paketverarbeitung.

Mit set() lassen sich portspezifische Optionen wie open_eof_split, package_max_length oder SSL-Zertifikate konfigurieren, ohne die globalen Server-Einstellungen zu beeinflussen. Mit on() registriert man Event-Handler für Events wie connect, receive, close oder packet ausschließlich für diesen Port.

Das Objekt kann nicht direkt instanziiert werden; es wird ausschließlich als Rückgabewert von Swoole\Server::listen() erhalten. Eigenschaften wie host, port, type und sock stehen als schreibgeschützte öffentliche Attribute zur Inspektion bereit.

Beispiele

Multi-Port-Server mit separaten Protokollen

<?php
// Hauptserver auf Port 9501 (TCP)
$server = new Swoole\Server('0.0.0.0', 9501);

$server->set([
    'worker_num' => 2,
]);

$server->on('receive', function ($server, $fd, $reactorId, $data) {
    $server->send($fd, 'Hauptport: ' . $data);
});

// Zusätzlicher Port 9502 mit eigenem Protokoll
/** @var Swoole\Server\Port $port */
$port = $server->listen('0.0.0.0', 9502, SWOOLE_SOCK_TCP);

$port->set([
    'open_eof_split'  => true,
    'package_eof'     => "\r\n",
    'package_max_length' => 1024 * 64,
]);

$port->on('connect', function ($server, $fd) {
    echo "Neuer Client auf Port 9502: fd={$fd}\n";
});

$port->on('receive', function ($server, $fd, $reactorId, $data) {
    $server->send($fd, 'Port-9502-Antwort: ' . trim($data) . "\r\n");
});

$port->on('close', function ($server, $fd) {
    echo "Client getrennt: fd={$fd}\n";
});

$server->start();

Port-Eigenschaften auslesen

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

$server->on('receive', function ($server, $fd, $reactorId, $data) {});

/** @var Swoole\Server\Port $port */
$port = $server->listen('127.0.0.1', 9600, SWOOLE_SOCK_TCP);

// Eigenschaften des Port-Objekts inspizieren
echo 'Host: ' . $port->host . PHP_EOL;  // 127.0.0.1
echo 'Port: ' . $port->port . PHP_EOL;  // 9600
echo 'Typ:  ' . $port->type . PHP_EOL;  // z. B. 1 (SWOOLE_SOCK_TCP)
echo 'Sock: ' . $port->sock . PHP_EOL;  // Dateideskriptor des Sockets

$server->start();
Host: 127.0.0.1 Port: 9600 Typ: 1 Sock: 5

// Wichtig · Fallstricke

Nicht direkt instanziierbar: new Swoole\Server\Port() ist nicht vorgesehen; das Objekt wird ausschließlich von Swoole\Server::listen() zurückgegeben.

Callback-Vererbung: Werden für einen Zusatz-Port keine eigenen Event-Callbacks registriert, greift Swoole je nach Version auf die globalen Server-Callbacks zurück oder ignoriert eingehende Events auf diesem Port – daher immer zumindest receive bzw. packet registrieren.

SSL/TLS: Soll ein Port TLS verwenden, muss der Socket-Typ als SWOOLE_SOCK_TCP | SWOOLE_SSL angegeben und über set() müssen ssl_cert_file und ssl_key_file konfiguriert werden. Der Hauptserver muss mit SSL-Unterstützung kompiliert sein.

Swoole-Version: API-Details können sich zwischen Minor-Versionen von Swoole unterscheiden. Die offizielle Dokumentation unter wiki.swoole.com ist stets aktuell zu prüfen.