PHP Conference Japan 2024

stream_set_timeout

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

stream_set_timeout设置流的超时时间

描述

stream_set_timeout(资源 $stream, 整数 $seconds, 整数 $microseconds = 0): 布尔值

设置 stream 的超时值,以 secondsmicroseconds 的总和表示。

当流超时时,stream_get_meta_data() 返回的数组的 'timed_out' 键被设置为 true,但不会生成错误/警告。

参数

stream

目标流。

seconds

要设置的超时的秒部分。

microseconds

要设置的超时的微秒部分。

返回值

成功返回 true,失败返回 false

示例

示例 #1 stream_set_timeout() 示例

<?php
$fp
= fsockopen("www.example.com", 80);
if (!
$fp) {
echo
"无法打开\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
'连接超时!';
} else {
echo
$res;
}

}
?>

注释

注意:

此函数不适用于高级操作,例如 stream_socket_recvfrom(),请改用带有超时参数的 stream_select()

此函数以前称为 set_socket_timeout(),后来改为 socket_set_timeout(),但此用法已弃用。

参见

添加注释

用户贡献的注释 4 条注释

25
hamishcool3 at yahoo dot co dot uk
14 年前
如果有人感到困惑,stream_set_timeout 不适用于使用 socket_create 或 socket_accept 创建的套接字。请改用 socket_set_option。

不要使用
<?php
stream_set_timeout
($socket,$sec,$usec);
?>

请使用
<?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));
?>
1
burninleo at gmx dot net
8 年前
另一个注释已经指出,如果对方响应非常缓慢或根本没有响应,阻塞读取可能是一个问题——流超时在这种情况下可能无法按预期工作。

但是,php.net 提供的关于如何使用非阻塞读取操作的信息很少。这是一个代码示例

<?php
stream_set_timeout
($c, $timeout);
$data = '';
while (
is_resource($c) && !feof($c)) {
// 使用非阻塞读取方式进行第一次循环
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); // 注意:这可能需要调整
$str.= fgets($c, 515);
}
// 处理第一次读取超时
if (time() >= $endtimeOut) {
trigger_error('Timeout', E_USER_WARNING);
break;
}
stream_set_blocking($c, true);
} else {
$str = fgets($c, 515);
}
$data.= $str;

// 处理“传统”超时
$info = stream_get_meta_data($c);
if (
$info['timed_out']) {
trigger_error('Timeout', E_USER_WARNING);
break;
}
}
?>
1
[email protected]
13年前
这个函数在作为CLI脚本运行时似乎无效,参见 http://bugs.php.net/bug.php?id=36030
1
ridera
19年前
我发现需要添加

"stream_set_blocking($fp, FALSE )"

在任何fgets(),fread()等之前,以防止在调用远程文件且响应缓慢时代码挂起。
To Top