Descripción
int
stream_select ( array &lectura, array &escritura, array &excepcional, int tv_sec [, int tv_usec])
La función stream_select() acepta una
matriz de secuencias y espera a que éstas cambien su
status. Su operación es equivalente a la de la
función socket_select(), excepto que
actúa sobre secuencias.
Las secuencias listadas en la matriz
lectura serán vigiladas para ver si
aparecen caracteres disponibles para lectura (o más
precisamente, para ver si una operación de lectura no
producirá un bloqueo - en particular, un recurso de
secuencia se encuentra listo también al llegar al final
del archivo, en cuyo caso un llamado a fread()
devolverá una cadena de longitud cero).
Las secuencias listadas en la matriz
escritura serán vigiladas para ver
si una escritura no crea bloqueos.
Las secuencias listadas en la matriz
excepcional serán vigiladas por la
llegada de datos excepcionales ("out-of-band") de alta prioridad.
Nota:
Cuando stream_select() devuelve un valor, las
matrices lectura,
escritura y
excepcional son modificadas para indicar
cuáles recursos de secuencia modificaron su status en
realidad.
Los parámetros tv_sec y
tv_usec, juntos forman el parámetro
tiempo de espera,
tv_sec especifica el número de
segundos, mientras que tv_usec el
número de microsegundos. El tiempo de
espera es un límite superior sobre la cantidad
de tiempo que stream_select() esperará
antes de devolver un valor. Si tanto
tv_sec como tv_usec
son definidos como 0,
stream_select() no esperará por datos -
en su lugar devolverá un valor inmediatamente, indicando
el status actual de las secuencias. Si
tv_sec es NULL
stream_select() puede crear un bloqueo
indefinidamente, y sólo devolverá un valor cuando
ocurra un evento en alguna de las secuencias vigiladas (o si una
señal interrumpe el llamado de sistema).
En caso de éxito, stream_select()
devuelve el número de recursos de secuencia modificados
contenidos en las matrices, que puede ser cero si el tiempo de
espera expira antes de que algo interesante suceda. En caso de
fallo, el valor FALSE es devuelto y se genera una advertencia
(esto puede pasar si el llamado de sistema es interrumpido por
una señal entrante).
| Aviso |
El uso de un valor de tiempo de espera de 0
le permite consultar el status de las secuencias de forma
instantánea, sin embargo, NO es buena idea usar un valor
de tiempo de espera de 0 en un ciclo, dado
que causará que su script consuma mucho tiempo de CPU.
Es mucho mejor especificar un valor de tiempo de espera de
algunos pocos segundos, aunque si necesita hacer chequeos y
ejecutar otro segmento de código concurrentemente, usar
un valor de tiempo de espera de por lo menos
200000 microsegundos le ayudará a
reducir el uso de CPU de su script.
Recuerde que el valor de tiempo de espera es el tiempo
máximo que transcurrirá;
stream_select() devolverá un valor tan
pronto como las secuencias solicitadas se encuentren listas para
su uso.
|
No necesita pasar cada matriz a
stream_select(). Puede dejar de especificarlas
y usar una matriz vacía o NULL en su lugar. Tampoco
olvide que éstas matrices son pasadas por
referencia y serán modificadas después
de que stream_select() devuelva un valor.
Este ejemplo revisa si han llegado datos para lectura ya sea en
$secuencia1 o en
$secuencia2. Dado que el valor de tiempo
de espera es 0, la función
retornará inmediatamente:
<?php /* Preparar la matriz de lectura */ $lectura = array($secuencia1, $secuencia2);
if (false === ($num_secuencias_modificadas = stream_select($lectura, $escritura = NULL, $excepcional = NULL, 0))) { /* Gestion de errores */ } elseif ($num_secuencias_modificadas > 0) { /* En por lo menos una de las secuencias ha ocurrido algo interesante */ } ?>
|
Nota:
Debido a una limitación en el Motor Zend actual, no es
posible pasar un modificador constante como NULL directamente
como parámetro a una función que espera que tal
parámetro sea pasado por referencia. En su lugar, use una
variable temporal o una expresión en donde el miembro del
lado izquierdo sea una variable temporal:
<?php stream_select($l, $e, $ex = NULL, 0); ?>
|
Nota:
Asegúrese de usar el operador ===
cuando efectúe chequeos de error. Dado que
stream_select() puede devolver 0, la
comparación con == evaluaría a
TRUE:
<?php if (false === stream_select($l, $e, $ex = NULL, 0)) { echo "stream_select() falló\n"; } ?>
|
Nota:
Si lee/escribe sobre una secuencia devuelta con las matrices,
tenga en cuenta que éstas no necesariemente leen/escriben
la cantidad completa de datos que usted ha
solicitado. Prepárese para gestionar incluso la
lectura/escritura de un solo byte.
Nota de Windows 98:
El uso de stream_select() sobre un pipe
devuelto desde proc_open() puede causar
pérdida de datos bajo Windows 98.
Vea también stream_set_blocking().