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_blockingsaustream_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.