Ce face stream_socket_accept
După ce ai creat serverul cu stream_socket_server, stream_socket_accept preia următorul client care s-a conectat. Primești un stream nou, doar pentru acel client: din el citești cererea și în el scrii răspunsul.
Dacă niciun client nu se conectează în $timeout secunde (implicit default_socket_timeout, 60), funcția returnează false cu un avertisment. În $peer_name primești adresa clientului.
Parametri
| Parametru | Descriere |
|---|---|
$socket |
Socket-ul de server din stream_socket_server. |
$timeout |
Opțional. Secundele de așteptare. -1 înseamnă fără limită. |
$peer_name |
Opțional. Variabilă în care se pune adresa clientului, ip:port. |
Ce returnează
Stream-ul conexiunii cu clientul sau false dacă timpul a expirat.
Exemple
Exemplul 1: Cine s-a conectat
<?php
$server = stream_socket_server("tcp://127.0.0.1:0");
$client = stream_socket_client("tcp://" . stream_socket_get_name($server, false));
$conexiune = stream_socket_accept($server, 2, $adresa_client);
[$ip, $port] = explode(":", $adresa_client);
echo "Client nou de la $ip\n";
var_dump(is_resource($conexiune));
Rezultat
Client nou de la 127.0.0.1
bool(true)
Exemplul 2: Bucla unui server simplu
Serverul rulează la nesfârșit și servește clienții pe rând. -1 înseamnă că așteaptă oricât un client nou.
<?php
$server = stream_socket_server("tcp://127.0.0.1:8000", $cod, $mesaj);
echo "Server pornit pe portul 8000\n";
while ($conexiune = stream_socket_accept($server, -1, $adresa)) {
$comanda = trim(fgets($conexiune));
echo "[$adresa] $comanda\n";
fwrite($conexiune, $comanda === "ora" ? date("H:i") . "\n" : "Comandă necunoscută\n");
fclose($conexiune);
}
Rezultat posibil (depinde de clienți)
Server pornit pe portul 8000
[127.0.0.1:52144] ora
[127.0.0.1:52150] meniu
Greșeli frecvente
- Lași timeout-ul implicit într-un server care trebuie să ruleze continuu. După 60 de secunde fără clienți, funcția returnează
falseși bucla se oprește. Dă-1sau foloseștestream_select. - Uiți
fclose($conexiune)după răspuns. Clientul nu află că răspunsul s-a terminat, iar serverul păstrează conexiuni deschise.
Comenzi înrudite
stream_socket_server: Creează un socket de server care ascultă pe o adresă și un port, pentru conexiuni primite cu stream_socket_accept.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_socket_get_name: Returnează adresa locală sau adresa celuilalt capăt al unui socket, în forma ip:port.