stream_set_timeout
(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_get_meta_data() is set to true
, although no
error/warning is generated.
参数
stream
-
The target stream.
seconds
-
The seconds part of the timeout to be set.
microseconds
-
The microseconds part of the timeout to be set.
示例
示例 #1 stream_set_timeout() example
<?php
$fp = fsockopen("www.example.com", 80);
if (!$fp) {
echo "Unable to open\n";
} else {
fwrite($fp, "GET / HTTP/1.0\r\n\r\n");
stream_set_timeout($fp, 2);
$res = fread($fp, 2000);
$info = stream_get_meta_data($fp);
fclose($fp);
if ($info['timed_out']) {
echo 'Connection timed out!';
} else {
echo $res;
}
}
?>
注释
注意:
This function doesn't work with advanced operations like stream_socket_recvfrom(), use stream_select() with timeout parameter instead.
This function was previously called as set_socket_timeout() and later socket_set_timeout() but this usage is deprecated.
参见
- fsockopen() - 打开 Internet 或者 Unix 套接字连接
- fopen() - 打开文件或者 URL
用户贡献的备注 4 notes
In case anyone is puzzled, stream_set_timeout DOES NOT work for sockets created with socket_create or socket_accept. Use socket_set_option instead.
Instead of:
<?php
stream_set_timeout($socket,$sec,$usec);
?>
Use:
<?php
socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array('sec'=>$sec, 'usec'=>$usec));
socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, array('sec'=>$sec, 'usec'=>$usec));
?>
Another note alread states that blocking-reads may be an issue, if the counterpart responds very slowly - or not at all. The stream timeout may not work as expected in such a situation.
However, php.net provides very little information on how to use non-blocking reading operations. Here's a code sample:
<?php
stream_set_timeout($c, $timeout);
$data = '';
while (is_resource($c) && !feof($c)) {
// Use non-blocking reading for first loop
if (($data === '') and ($timeout > 0)) {
stream_set_blocking($c, false);
$endtimeOut = time() + $timeout;
$str = '';
while ((time() < $endtimeOut) and (strlen($str) < 515) and !feof($c)) {
sleep(1); // Note: This may require tuning
$str.= fgets($c, 515);
}
// Handling first-read timeout
if (time() >= $endtimeOut) {
trigger_error('Timeout', E_USER_WARNING);
break;
}
stream_set_blocking($c, true);
} else {
$str = fgets($c, 515);
}
$data.= $str;
// Handling of "traditional" timeout
$info = stream_get_meta_data($c);
if ($info['timed_out']) {
trigger_error('Timeout', E_USER_WARNING);
break;
}
}
?>
This function seems to have no effect when running as a CLI script, see http://bugs.php.net/bug.php?id=36030
备份地址:http://www.lvesu.com/blog/php/function.stream-set-timeout.php