PHP Streams函数

PHP stream_select() 函数接受具有由tv_sec和tv_usec指定的超时的流数组,并等待它们更改状态。

语法

stream_select(read, write, except, tv_sec, tv_usec) 

参数

read必填。 将监视读取数组中列出的流,以查看字符是否可供读取(更准确地说,查看读取是否不会阻塞 - 特别是,流资源在文件末尾也已准备好) ,在这种情况下 fread() 将返回零长度字符串。
write必填。 将监视 write 数组中列出的流,以查看写入是否不会阻塞。
except

必填。 将监视 except 数组中列出的流是否有高优先级异常("带外")数据到达。

注意:当 stream_select() 时返回,数组readwrite except被修改以指示哪个流资源实际改变了状态。保留数组的原始键。
tv_sec

必需。 tv_sectv_usec共同构成超时参数,tv_sec指定秒数,而tv_usec微秒数。超时是该函数返回之前等待的时间量的上限。如果tv_sectv_usec都设置为0,该函数将不会等待数据 - 相反,它将立即返回,指示流的当前状态。

如果tv_sec为空,stream_select()可以无限期地阻塞,仅当所监视的流之一上发生事件(或者信号中断系统调用)时才返回。
tv_usec可选。 请参阅tv_sec说明。

注意 :使用超时值 0 允许立即轮询流的状态,但是,不建议在循环中使用超时值 0,因为它会导致脚本消耗过多的 CPU 时间。

最好指定几秒的超时值,尽管如果需要同时检查和运行其他代码,使用至少 200000 微秒的超时值将有助于减少脚本的 CPU 使用率。

请注意,超时值是经过的最长时间。一旦请求的流可供使用,stream_select()函数就会返回。

返回值

成功时,此函数返回修改后的数组中包含的流资源的数量,如果在任何有趣的事情发生之前超时到期,则该数量可能为零。出错时返回 false 并引发警告(如果系统调用被传入信号中断,则可能会发生这种情况)。

示例:stream_select() 示例

下面的示例检查查看数据是否已到达以供在 $stream1$stream2 上读取。由于超时值为 0,它将立即返回。

<?php
//准备读取数组
$read = array($stream1, $stream2);
$write = NULL;
$except = NULL;

if (false === ($num_changed_streams = 
      stream_select($read, $write, $except, 0))) {
  //错误处理代码
} elseif ($num_changed_streams > 0) {
  //至少在其中一个流上
  //发生了一些有趣的事情
}
?> 

注意:由于当前 Zend 引擎的限制,它无法将像 null 这样的常量修饰符直接作为参数传递给希望通过引用传递此参数的函数。而是使用临时变量或最左侧成员为临时变量的表达式:

<?php
$e = NULL;
stream_select($r, $w, $e, 0);
?> 
注意:在检查错误时使用===运算符。由于stream_select()可能返回0,因此与==的比较结果将为true。