Start · Sprachen · PHP · Referenz · socket_create_pair

socket_create_pair

Funktion

Erzeugt ein Paar verbundener, identischer Sockets und speichert die beiden Socket-Ressourcen in dem übergebenen Array.

seit PHP 4.1.0 Kategorie: http

Signatur

socket_create_pair(int $domain, int $type, int $protocol, array &$pair): bool

Beschreibung

socket_create_pair() erstellt zwei miteinander verbundene Sockets (ein sogenanntes Socket-Paar) und speichert sie im Array $pair. Die beiden Sockets sind direkt miteinander verbunden – Daten, die auf dem einen Socket gesendet werden, können auf dem anderen empfangen werden, ohne dass ein Netzwerk-Bind oder -Connect nötig ist.

Diese Funktion eignet sich besonders für die Inter-Prozess-Kommunikation (IPC): Nach einem pcntl_fork() kann jeder Prozess einen der beiden Sockets verwenden, um bidirektional mit dem anderen Prozess zu kommunizieren. Unter Unix entspricht dies dem socketpair()-Systemaufruf.

Als $domain wird für lokale IPC üblicherweise AF_UNIX verwendet. Der $type bestimmt die Art der Kommunikation (z. B. SOCK_STREAM für zuverlässige, verbindungsorientierte Byteströme oder SOCK_DGRAM für Datagramme). $protocol ist bei AF_UNIX in der Regel 0.

Hinweis: Unter Windows ist diese Funktion nicht verfügbar, da Windows den AF_UNIX-Domain nicht vollständig unterstützt. Sie ist praktisch ausschließlich für Unix/Linux-Systeme gedacht.

Parameter

Name Typ Default Beschreibung
$domain Pflicht int Die Protokollfamilie des Sockets. Für lokale IPC wird AF_UNIX verwendet. Andere Werte wie AF_INET werden von den meisten Betriebssystemen für socketpair() nicht unterstützt.
$type Pflicht int Der Socket-Typ. Typische Werte sind SOCK_STREAM (verbindungsorientierter Bytestrom), SOCK_DGRAM (verbindungsloser Datagramm-Socket) oder SOCK_SEQPACKET.
$protocol Pflicht int Das verwendete Protokoll. Bei AF_UNIX sollte dieser Wert 0 sein. Für andere Domains kann SOL_TCP oder SOL_UDP angegeben werden.
$pair Pflicht array Wird als Referenz übergeben und nach erfolgreichem Aufruf mit zwei Socket-Ressourcen (bzw. ab PHP 8.0 Socket-Objekten) befüllt: $pair[0] und $pair[1].

Rückgabewert

Typ
bool
Beschreibung
Gibt true bei Erfolg zurück. Im Fehlerfall wird false zurückgegeben und der Fehler kann mit socket_last_error() sowie socket_strerror() abgefragt werden.

Beispiele

Einfache bidirektionale Kommunikation zwischen zwei Prozessen

<?php
// Socket-Paar erzeugen
if (!socket_create_pair(AF_UNIX, SOCK_STREAM, 0, $pair)) {
    die('Fehler beim Erstellen des Socket-Paares: ' . socket_strerror(socket_last_error()));
}

$pid = pcntl_fork();

if ($pid === -1) {
    die('Fork fehlgeschlagen.');
} elseif ($pid === 0) {
    // Kindprozess: nutzt $pair[1]
    socket_close($pair[0]);
    $msg = socket_read($pair[1], 1024);
    echo "Kind empfangen: $msg\n";
    socket_write($pair[1], 'Hallo vom Kind!');
    socket_close($pair[1]);
    exit(0);
} else {
    // Elternprozess: nutzt $pair[0]
    socket_close($pair[1]);
    socket_write($pair[0], 'Hallo vom Elternteil!');
    $antwort = socket_read($pair[0], 1024);
    echo "Elternteil empfangen: $antwort\n";
    socket_close($pair[0]);
    pcntl_wait($status);
}
Kind empfangen: Hallo vom Elternteil! Elternteil empfangen: Hallo vom Kind!

Socket-Paar erstellen und Verbindung prüfen

<?php
$pair = [];
if (socket_create_pair(AF_UNIX, SOCK_STREAM, 0, $pair)) {
    echo "Socket-Paar erfolgreich erstellt.\n";

    // Daten senden und empfangen
    socket_write($pair[0], 'Testnachricht', 13);
    $data = socket_read($pair[1], 1024);
    echo "Empfangen: $data\n";

    socket_close($pair[0]);
    socket_close($pair[1]);
} else {
    echo 'Fehler: ' . socket_strerror(socket_last_error()) . "\n";
}
Socket-Paar erfolgreich erstellt. Empfangen: Testnachricht

// Wichtig · Fallstricke

Plattform-Einschränkung: socket_create_pair() ist unter Windows nicht verfügbar, da der AF_UNIX-Domain dort nicht unterstützt wird. Der Einsatz ist auf Unix/Linux-Systeme beschränkt.

Ressourcenmanagement: Beide Sockets im Paar müssen nach der Verwendung mit socket_close() geschlossen werden, um Ressourcenlecks zu vermeiden. Bei Verwendung nach einem Fork sollte jeder Prozess den Socket des jeweils anderen Prozesses sofort schließen.

Ab PHP 8.0 gibt die Funktion Socket-Objekte anstelle von Ressourcen zurück, was mit dem neuen objektorientierten Socket-API konsistent ist.