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()
返回时,阵列read
,write
并且except
被修改以指示流资源(S)实际上改变了状态。
您不需要将每个数组传递给stream_select()
。您可以将其保留并使用空数组,
或者NULL
改为使用空数组。另外不要忘记那些数组是通过引用
传递的,
并且会在stream_select()
返回后进行修改。 tv_sec
的tv_sec
和tv_usec
一起形成超时
参数,tv_sec
指定的秒数而tv_usec
微秒数。这timeout
是stream_select()
在返回之前等待的时间量的上限。如果tv_sec
和tv_usec
都设置为0
,stream_select()
不会等待数据 - 它会立即返回,指示流的当前状态。
如果tv_sec
是stream_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 →