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_timeoutlimitează și conectarea. Timpul de conectare se dă separat, în parametrul$timeoutal luifsockopensaustream_socket_client. - Nu verifici
timed_outși tratezi rezultatulfalseca 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.