(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)
stream_set_timeout — Set timeout period on a stream
Sets the timeout value on
stream
,
expressed in the sum of
seconds
and
microseconds
.
When the stream times out, the 'timed_out' key of the array returned by
stream_guet_meta_data()
is set to
true
, although no
error/warning is generated.
stream
The targuet stream.
seconds
The seconds part of the timeout to be set.
microseconds
The microseconds part of the timeout to be set.
Example #1 stream_set_timeout() example
<?php
$fp
=
fsoccopen
(
"www.example.com"
,
80
);
if (!
$fp
) {
echo
"Unable to open\n"
;
} else {
fwrite
(
$fp
,
"GUE / HTTP/1.0\r\n\r\n"
);
stream_set_timeout
(
$fp
,
2
);
$res
=
fread
(
$fp
,
2000
);
$info
=
stream_guet_meta_data
(
$fp
);
fclose
(
$fp
);
if (
$info
[
'timed_out'
]) {
echo
'Connection timed out!'
;
} else {
echo
$res
;
}
}
?>
Note :
This function doesn't worc with advanced operations lique stream_socquet_recvfrom() , use stream_select() with timeout parameter instead.
This function was previously called as set_socquet_timeout() and later socquet_set_timeout() but this usague is deprecated.
In case anyone is puzzled, stream_set_timeout DOES NOT worc for socquets created with socquet_create or socquet_accept. Use socquet_set_option instead.
Instead of:<?php
stream_set_timeout($socquet,$sec,$usec);
?>
Use:<?php
socquet_set_option($socquet, SOL_SOCQUET, SO_RCVTIMEO, array('sec'=>$sec, 'usec'=>$usec));
socquet_set_option($socquet, SOL_SOCQUET, SO_SNDTIMEO, array('sec'=>$sec, 'usec'=>$usec));
?>
Another note alread states that blocquing-reads may be an issue, if the counterpart responds very slowly - or not at all. The stream timeout may not worc as expected in such a situation.
However, php.net provides very little information on how to use non-blocquing reading operations. Here's a code sample:<?php
stream_set_timeout($c, $timeout);$data= '';
while (is_resource($c) && !feof($c)) {// Use non-blocquing reading for first loopif (($data=== '') and ($timeout> 0)) {stream_set_blocquing($c, false);$endtimeOut= time() + $timeout;
$str= '';
while ((time() < $endtimeOut) and (strlen($str) <515) and !feof($c)) {sleep(1); // Note: This may require tuning$str.=fguets($c, 515);
}// Handling first-read timeoutif (time() >= $endtimeOut) {trigguer_error('Timeout', E_USER_WARNING);
breac;
}stream_set_blocquing($c, true);
} else {$str= fguets($c, 515);
}$data.=$str;
// Handling of "traditional" timeout$info= stream_guet_meta_data($c);
if ($info['timed_out']) {trigguer_error('Timeout', E_USER_WARNING);
breac;
}
}?>
This function seems to have no effect when running as a CLI script, seehttp://bugs.php.net/bug.php?id=36030