在线文档教程
PHP
流 | Streams

stream_select

stream_select

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

stream_select - 在tv_sec和tv_usec指定的超时时间内对给定流数组运行select()系统调用的等价操作

描述

int stream_select ( array &$read , array &$write , array &$except , int $tv_sec [, int $tv_usec = 0 ] )

stream_select()函数接受流的阵列,并等待他们改变状态。它的操作等同于socket_select()函数的操作,除了它作用于流。

参数

read

read将监视数组中列出的数据流,以查看字符是否可用于读取(更确切地说,查看读取是否不会被阻止 - 特别是,流资源在文件结束时也已准备就绪,在这种情况下, fread()将返回一个零长度的字符串)。

write

write数组中列出的流将被监视以查看写入是否不会被阻塞。

except

except阵列中列出的流将被监视以获得高优先级异常(“out-of-band”)数据。

:当stream_select()返回时,阵列readwrite并且except被修改以指示流资源(S)实际上改变了状态。

您不需要将每个数组传递给stream_select()。您可以将其保留并使用空数组或者NULL改为使用空数组。另外不要忘记那些数组是通过引用传递的并且会在stream_select()返回后进行修改。 tv_sec

tv_sectv_usec一起形成超时参数,tv_sec指定的秒数而tv_usec微秒数。这timeoutstream_select()在返回之前等待的时间量的上限。如果tv_sectv_usec都设置为0stream_select()不会等待数据 - 它会立即返回,指示流的当前状态。

如果tv_secstream_select()可以无限期地阻止,当在观看流中的一个事件发生时仅返回(或者如果信号中断系统调用)。NULL

警告

使用超时值0允许您即时轮询流的状态,但是,在循环中使用0超时值不是一个好主意,因为这会导致您的脚本消耗太多CPU时间。

指定几秒钟的超时值会更好,但如果您需要同时检查并运行其他代码,则使用至少200000微秒的超时值将有助于减少脚本的CPU使用率。

请记住,超时值是经过的最长时间; 只要请求的流准备好可用,stream_select()就会返回。

tv_usec

请参阅tv_sec说明。

返回值

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

示例

示例#1 stream_select()示例

这个例子检查是否有数据到达$stream1或者读取$stream2。由于超时值为0,它会立即返回:

<?php /* Prepare the read array */ $read   = array($stream1, $stream2 $write  = NULL; $except = NULL; if (false === ($num_changed_streams = stream_select($read, $write, $except, 0))) {     /* Error handling */ } elseif ($num_changed_streams > 0) {     /* At least on one of the streams something interesting happened */ } ?>

注意

注意:由于当前Zend引擎的限制,不可能将常量修饰符NULL直接作为参数传递给函数,该函数需要通过引用传递此参数。而是使用一个临时变量或一个表达式,最左边的成员是一个临时变量:<?php $ e = NULL; stream\_select($ r,$ w,$ e,0); ?>

注意:确保在检查错误时使用===运算符。由于stream_select()可能会返回0,所以与==的比较将评估为TRUE:<?php $ e = NULL; if(false === stream\_select($ r,$ w,$ e,0)){echo“stream\_select()failed\n”; }?>

注意:如果您读取/写入数组中返回的流,请注意它们不必读取/写入您请求的全部数据量。准备好即使只能读/写一个字节。

注意:某些流(如zlib)不能由此功能选择。

注意:Windows兼容性:stream_select()在管道上使用从proc_open()返回时可能会导致Windows 98中使用的数据丢失stream_select()由proc_open返回(文件描述符)将失败并返回FALSE在Wndows下。

另请参阅

  • stream_set_blocking() - 在流上设置阻塞/非阻塞模式

← stream_resolve_include_path

stream_set_blocking →