stream_socket_accept în PHP

Socket-uri PHP 5.0+

Așteaptă și acceptă o conexiune nouă pe un socket de server; returnează stream-ul pentru acel client.

Sintaxă
stream_socket_accept($socket, ?float $timeout = null, &$peer_name = null)

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ă -1 sau folosește stream_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.