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