stream_resolve_include_path
stream_set_blocking
Stream Functions
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, $excepcional, 0))) {
/* 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, $ex, 0);
> ?>`

> 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, $ex, 0)) {
> 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().

stream_resolve_include_path
stream_set_blocking
Stream Functions
PHP Manual