stream_socket_pair în PHP

Socket-uri PHP 5.1+

Creează două socket-uri legate între ele: ce scrii într-unul se citește din celălalt, în ambele sensuri.

Sintaxă
stream_socket_pair(int $domain, int $type, int $protocol): array|false

Ce face stream_socket_pair

stream_socket_pair returnează un tablou cu două stream-uri conectate direct, fără rețea. Se folosește pentru comunicarea între un proces părinte și un proces copil (de exemplu după pcntl_fork) sau în teste, ca să simulezi o conexiune.

Pe Linux și macOS, apelul obișnuit este stream_socket_pair(STREAM_PF_UNIX, STREAM_SOCK_STREAM, STREAM_IPPROTO_IP). Pe Windows folosește STREAM_PF_INET în loc de STREAM_PF_UNIX.

Parametri

Parametru Descriere
$domain Familia: STREAM_PF_UNIX, STREAM_PF_INET sau STREAM_PF_INET6.
$type Tipul: STREAM_SOCK_STREAM (flux, ca TCP) sau STREAM_SOCK_DGRAM (mesaje, ca UDP).
$protocol Protocolul: de obicei STREAM_IPPROTO_IP.

Ce returnează

Un tablou cu două stream-uri sau false la eroare.

Exemple

Exemplul 1: Mesaje în ambele sensuri

<?php
[$parinte, $copil] = stream_socket_pair(STREAM_PF_UNIX, STREAM_SOCK_STREAM, STREAM_IPPROTO_IP);

fwrite($parinte, "Calculează totalul comenzii 101\n");
echo "Copilul a primit: " . fgets($copil);

fwrite($copil, "Total: 250 lei\n");
echo "Părintele a primit: " . fgets($parinte);

Rezultat

Copilul a primit: Calculează totalul comenzii 101
Părintele a primit: Total: 250 lei

Exemplul 2: Un capăt nu își primește propriul mesaj

Ce scrii în $a ajunge doar în $b. Citirea neblocantă din $a nu găsește nimic.

<?php
[$a, $b] = stream_socket_pair(STREAM_PF_UNIX, STREAM_SOCK_STREAM, STREAM_IPPROTO_IP);
stream_set_blocking($a, false);

fwrite($a, "test");
var_dump(fread($a, 10));
var_dump(fread($b, 10));

Rezultat

string(0) ""
string(4) "test"

Greșeli frecvente

  • Citești blocant de la un capăt la care nu a scris nimeni. Scriptul așteaptă la nesfârșit. Folosește stream_set_timeout, stream_set_blocking sau stream_select.

Comenzi înrudite

  • stream_select: Așteaptă până când unul sau mai multe stream-uri (socket-uri, pipe-uri) au date de citit sau pot primi date.
  • stream_set_blocking: Alege dacă citirile dintr-un stream așteaptă date (blocant) sau returnează imediat ce este disponibil.
  • stream_socket_shutdown: Închide doar o direcție a unei conexiuni (scrierea, citirea sau ambele), fără să elibereze stream-ul.
  • proc_open: Pornește un proces cu control complet: canale separate pentru intrare, ieșire și erori, director și variabile de mediu proprii.