Secuencias
PHP Manual

stream_select

(PHP 4 >= 4.3.0, PHP 5)

stream_select — Ejecuta el equivalente al llamado de sistema select() en la matriz de secuencias dada, con un tiempo de espera especificado por tv_sec y tv_usec

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.

Note: 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).

Warning

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 estas 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);
$escritura  NULL;
$excepcional NULL;
if (
false === ($num_secuencias_modificadas stream_select($lectura$escritura$excepcional0))) {
    
/* Gestión de errores */
} elseif ($num_secuencias_modificadas 0) {
    
/* En por lo menos una de las secuencias ha ocurrido algo interesante */
}
?>

Note: 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
$ex 
NULL;
stream_select($lec$esc$ex0);
?>

Note: 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
$ex 
NULL;
if (
false === stream_select($lec$esc$ex0)) {
    echo 
"stream_select() falló\n";
}
?>

Note: 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.

Note: Compatibilidad con Windows: El uso de stream_select() sobre un pipe devuelto desde proc_open() puede causar pérdida de datos bajo Windows 98.
El uso de stream_select() con descriptores de archivo devueltos por proc_open() fallará y devolverá FALSE bajo Windows.

Vea también stream_set_blocking().


Secuencias
PHP Manual