stream_set_timeout în PHP

Stream-uri PHP 4.3+

Stabilește cât timp așteaptă o citire de pe un socket înainte să renunțe.

Sintaxă
stream_set_timeout($stream, int $seconds, int $microseconds = 0): bool

Ce face stream_set_timeout

Fără timeout, o citire de pe un server care nu mai răspunde poate bloca scriptul mult timp (implicit default_socket_timeout, 60 de secunde). stream_set_timeout scurtează sau lungește această așteptare pentru un singur stream.

Când timpul expiră, fread sau fgets returnează false, iar stream_get_meta_data($s)["timed_out"] devine true. Funcția merge doar pentru socket-uri; pentru alte stream-uri returnează false.

Parametri

Parametru Descriere
$stream Socket-ul, de exemplu din fsockopen sau stream_socket_client.
$seconds Secundele de așteptare.
$microseconds Opțional. Microsecunde adăugate la secunde.

Ce returnează

true la succes, false dacă stream-ul nu suportă timeout.

Exemple

Exemplul 1: O citire care expiră

Celălalt capăt nu trimite nimic. După 0,3 secunde citirea renunță.

<?php
[$a, $b] = stream_socket_pair(STREAM_PF_UNIX, STREAM_SOCK_STREAM, STREAM_IPPROTO_IP);
stream_set_timeout($b, 0, 300000);

$start = microtime(true);
$date = fread($b, 100);
$durata = microtime(true) - $start;

var_dump($date);
var_dump(stream_get_meta_data($b)["timed_out"]);
echo "A așteptat cel puțin 0,3 s: " . ($durata >= 0.29 ? "da" : "nu");

Rezultat

bool(false)
bool(true)
A așteptat cel puțin 0,3 s: da

Exemplul 2: Doar pentru socket-uri

<?php
$m = fopen("php://memory", "r+");
var_dump(stream_set_timeout($m, 5));

Rezultat

bool(false)

Greșeli frecvente

  • Crezi că stream_set_timeout limitează și conectarea. Timpul de conectare se dă separat, în parametrul $timeout al lui fsockopen sau stream_socket_client.
  • Nu verifici timed_out și tratezi rezultatul false ca pe un final normal al conexiunii.

Comenzi înrudite

  • stream_get_meta_data: Returnează informații despre un stream deschis: tipul, modul, poziția la final, timeout, antetele HTTP.
  • fsockopen / pfsockopen: Deschide o conexiune TCP (sau UDP, SSL) către un server și o returnează ca stream, pentru fwrite și fgets.
  • stream_socket_client: Deschide o conexiune către un server dată ca adresă completă (tcp://, udp://, tls://, unix://) și o returnează ca stream.
  • set_time_limit: Stabilește câte secunde poate rula scriptul înainte să fie oprit.