stream_socket_client în PHP

Socket-uri PHP 5.0+

Deschide o conexiune către un server dată ca adresă completă (tcp://, udp://, tls://, unix://) și o returnează ca stream.

Sintaxă
stream_socket_client(string $address, &$error_code = null, &$error_message = null, ?float $timeout = null, int $flags = STREAM_CLIENT_CONNECT, $context = null)

Ce face stream_socket_client

stream_socket_client este varianta modernă a lui fsockopen. Adresa se scrie dintr-o bucată: tcp://127.0.0.1:6379, tls://smtp.exemplu.ro:465, unix:///run/php/aplicatie.sock.

În plus față de fsockopen, primește un context de stream (de exemplu opțiunile ssl pentru certificate) și flag-uri: STREAM_CLIENT_ASYNC_CONNECT pentru conectare fără așteptare, STREAM_CLIENT_PERSISTENT pentru conexiune persistentă.

Parametri

Parametru Descriere
$address Adresa completă, cu transport și port: tcp://gazda:port.
$error_code Opțional. Variabilă pentru codul erorii.
$error_message Opțional. Variabilă pentru mesajul erorii.
$timeout Opțional. Secundele de așteptare pentru conectare.
$flags Opțional. STREAM_CLIENT_CONNECT (implicit), STREAM_CLIENT_ASYNC_CONNECT, STREAM_CLIENT_PERSISTENT.
$context Opțional. Un context creat cu stream_context_create.

Ce returnează

Un stream conectat sau false la eșec (cu avertisment).

Exemple

Exemplul 1: Client pentru un server local

<?php
$server = stream_socket_server("tcp://127.0.0.1:0");
$adresa = stream_socket_get_name($server, false);

$client = stream_socket_client("tcp://$adresa", $cod, $mesaj, 2);
$conexiune = stream_socket_accept($server);

fwrite($client, "PING\n");
echo "Server: " . fgets($conexiune);
fwrite($conexiune, "PONG\n");
echo "Client: " . fgets($client);

Rezultat

Server: PING
Client: PONG

Exemplul 2: Conexiune criptată la un server SMTP

<?php
$context = stream_context_create(["ssl" => ["verify_peer" => true]]);
$smtp = stream_socket_client("tls://smtp.exemplu.ro:465", $cod, $mesaj, 5, STREAM_CLIENT_CONNECT, $context);

if ($smtp === false) {
    exit("Eroare $cod: $mesaj");
}
echo fgets($smtp);

Rezultat posibil (depinde de server)

220 smtp.exemplu.ro ESMTP gata

Greșeli frecvente

  • Uiți transportul sau portul din adresă: stream_socket_client("smtp.exemplu.ro"). Scrie adresa întreagă: tcp://smtp.exemplu.ro:25.
  • Folosești ssl:// și dezactivezi verify_peer ca să scapi de o eroare de certificat. Conexiunea nu mai e protejată împotriva interceptării.

Comenzi înrudite

  • fsockopen / pfsockopen: Deschide o conexiune TCP (sau UDP, SSL) către un server și o returnează ca stream, pentru fwrite și fgets.
  • stream_socket_server: Creează un socket de server care ascultă pe o adresă și un port, pentru conexiuni primite cu stream_socket_accept.
  • stream_context_create: Creează un set de opțiuni (metodă, antete, timeout) pentru file_get_contents, fopen și alte funcții de fișier.
  • stream_set_timeout: Stabilește cât timp așteaptă o citire de pe un socket înainte să renunțe.