Ce face stream_set_blocking
Implicit, stream-urile sunt blocante: fread pe un socket sau pe un pipe așteaptă până sosesc date. Cu stream_set_blocking($s, false), citirea returnează imediat ce există în acel moment, chiar și text gol.
Modul neblocant este folosit împreună cu stream_select, ca un singur script să lucreze cu mai multe conexiuni sau procese în același timp. Numele vechi socket_set_blocking este un alias.
Parametri
| Parametru | Descriere |
|---|---|
$stream |
Stream-ul modificat, de obicei un socket sau un pipe. |
$enable |
true pentru blocant, false pentru neblocant. |
Ce returnează
true la succes, false la eroare.
Exemple
Exemplul 1: Citire neblocantă dintr-un socket
Prima citire primește mesajul trimis. A doua nu mai are ce citi și returnează imediat text gol. Într-un stream blocant, a doua citire ar fi așteptat la nesfârșit.
<?php
[$a, $b] = stream_socket_pair(STREAM_PF_UNIX, STREAM_SOCK_STREAM, STREAM_IPPROTO_IP);
stream_set_blocking($b, false);
fwrite($a, "salut");
var_dump(fread($b, 100));
var_dump(fread($b, 100));
var_dump(stream_get_meta_data($b)["blocked"]);
Rezultat
string(5) "salut"
string(0) ""
bool(false)
Exemplul 2: Ieșirea unui proces, fără să aștepți
Imediat după pornire, procesul nu a apucat să scrie nimic. După ce se termină, datele sunt acolo.
<?php
$proces = proc_open(["sh", "-c", "sleep 0.2; echo gata"], [1 => ["pipe", "w"]], $pipes);
stream_set_blocking($pipes[1], false);
var_dump(fread($pipes[1], 100));
usleep(500000);
var_dump(fread($pipes[1], 100));
proc_close($proces);
Rezultat
string(0) ""
string(5) "gata
"
Greșeli frecvente
- Aștepți ca modul neblocant să schimbe ceva la fișiere obișnuite. Fișierele de pe disc se citesc oricum imediat. Modul contează la socket-uri și pipe-uri.
- Scrii într-un stream neblocant și nu verifici rezultatul lui
fwrite. Poate scrie doar o parte din date. Restul trebuie trimis la un apel următor.
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_timeout: Stabilește cât timp așteaptă o citire de pe un socket înainte să renunțe.stream_socket_client: Deschide o conexiune către un server dată ca adresă completă (tcp://, udp://, tls://, unix://) și o returnează ca stream.