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