(PHP 4 = 4.3.0)
The
stream_select()
function accepts arrays of streams and waits for them to change
status. Its opperation is equivalent to that of the
socket_select()
function except in that it acts on streams.
The streams listed in the
read
array will be watched to see if characters become available for
reading (more precisely, to see if a read will not block - in
particular, a stream resource is also ready on end-of-file, in
which case an
fread()
will return a zero length string).
The streams listed in the
write
array will be watched to see if a write will not block.
The streams listed in the
except
array will be watched for exceptions.
警告 |
|
You do not need to pass every array to
stream_select()
. You can leave it out and use an empty array or
NULL
instead. Also do not forget that those arrays are passed
by reference
and will be modified after
stream_select()
returns.
Example:
/* Prepare the read array */ $read = array($stream1, $stream2); if (false === ($num_changed_streams = stream_select($read, $write = NULL, $except = NULL, 0))) { /* Error handling */ else if ($num_changed_streams 0) { /* At least on one of the streams something interesting happened */ } |
注意 Due a limitation in the current Zend Engine it is not possible to pass a constant modifier like NULL directly as a parameter to a function which expects this parameter to be passed by reference. Instead use a temporary variable or an expression with the leftmost member being a temporary variable:
stream_select($r, $w, $e = NULL, 0);
The
tv_sec
and
tv_usec
together form the
timeout
parameter. The
timeout
is an upper bound on the amount of time elapsed before
stream_select()
returns.
tv_sec
may be zero , causing
stream_select()
to return immediately. This is useful for polling. If
tv_sec
is
NULL
(no timeout),
stream_select()
can block indefinitely.
On success
stream_select()
returns the number of stream resorces contained in the modified
arrays, which may be zero if the timeout expires before
anything interesting happens. On error
FALSE
is returned.
注意 Be sure to use the === operator when checking for an error. Since the stream_select() may return 0 the comparison with == would evaluate to TRUE :
if (false === stream_select($r, $w, $e = NULL, 0)) { echo "stream_select() failed\n"; }
注意 Be aware that some stream implementations need to be handled very carefully. A few basic rules:
You should always try to use stream_select() without timeout. Your program should have nothing to do if there is no data available. Code that depends on timeouts is not usually portable and difficult to debug.
If you read/write to a stream returned in the arrays be aware that they do not necessarily read/write the full amount of data you have requested. Be prepared to even only be able to read/write a single byte.
See also
stream_set_blocking()