stream_select

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

stream_selectSupervisa la modificación de uno o varios flujos

Descripción

stream_select(
    ?array &$read,
    ?array &$write,
    ?array &$except,
    ?int $seconds,
    ?int $microseconds = null
): int|false

stream_select() acepta un array de flujos y espera a que alguno de ellos cambie de estado. Esta operación es equivalente a lo que hace la función socket_select(), salvo que trabaja sobre un flujo.

Parámetros

read

Los flujos que están listados en el parámetro read serán supervisados en lectura, es decir, si hay nuevos bytes disponibles para lectura (para ser precisos, si una lectura no bloqueará, lo que incluye también flujos que están al final de archivo, en cuyo caso una llamada a la función fread() retornará un string de tamaño 0).

write

Los flujos que están listados en el parámetro write serán supervisados en escritura (para ser precisos, si una escritura no bloqueará).

except

Los flujos que están listados en el parámetro except serán supervisados para ver si se lanza una excepción.

Nota:

Cuando stream_select() termina, los arrays read, write y except son modificados para indicar qué flujos han cambiado de estado actualmente. Las claves originales del array se preservan.

seconds

Los parámetros seconds y microseconds forman el tiempo límite, seconds especifica el número de segundos mientras que microseconds, el número de microsegundos. El parámetro timeout representa el límite superior del tiempo que stream_select() debe esperar antes de terminar. Si seconds y microseconds están ambos definidos a 0, stream_select() no esperará datos - en su lugar, terminará inmediatamente, indicando el estado actual del flujo.

Si seconds vale null, stream_select() puede bloquearse indefinidamente, terminando únicamente cuando un evento en alguno de los flujos supervisados ocurra (o si una señal interrumpe la llamada al sistema).

Advertencia

Utilizar un valor de 0 permite probar instantáneamente el estado de los flujos, pero debe saberse que no se recomienda utilizar 0 en un bucle, ya que esto hará que el script consuma una gran cantidad de procesador.

Es mucho mejor especificar un valor de algunos segundos, incluso si se debe supervisar y ejecutar diferentes códigos de manera simultánea. Por ejemplo, utilizar un valor de al menos 200000 microsegundos, se reducirá considerablemente el consumo de procesador del script.

No se debe olvidar que el valor de expiración es la duración máxima de espera, si no ocurre nada: stream_select() retornará un resultado tan pronto como uno de los flujos suministrados esté listo para su uso.

microseconds

Véase la descripción de seconds.

Valores devueltos

En caso de éxito, stream_select() retorna el número de flujos que han cambiado, lo que puede ser 0, si el tiempo límite fue alcanzado antes de que los flujos cambien. En caso de error, la función retornará false y un aviso será devuelto (esto puede ocurrir si la llamada al sistema es interrumpida por una señal entrante).

Historial de cambios

Versión Descripción
8.1.0 microseconds ahora es nullable.

Ejemplos

Ejemplo #1 Ejemplo con stream_select()

Este ejemplo supervisa si los datos llegan para ser leídos ya sea en $stream1 o en $stream2. Si el tiempo límite es 0, la función termina inmediatamente:

<?php
/* Preparación del array de flujos de lectura */
$read = array($stream1, $stream2);
$write = NULL;
$except = NULL;
if (
false === ($num_changed_streams = stream_select($read, $write, $except, 0))) {
/* Manejo de errores */
} elseif ($num_changed_streams > 0) {
/* Al menos uno de los flujos ha cambiado */
}
?>

Notas

Nota:

Debido a una limitación del motor Zend actual, no es posible pasar el valor null directamente como parámetro de una función que espera parámetros pasados por referencia. En su lugar, se recomienda utilizar una variable temporal, o una expresión cuyo miembro izquierdo sea una variable temporal. Como esto:

<?php
$e
= NULL;
stream_select($r, $w, $e, 0);
?>

Nota:

Asegúrese de utilizar el operador === cuando busque errores. Como stream_select() puede retornar 0, una comparación realizada con == lo evaluaría como true:

<?php
$e
= NULL;
if (
false === stream_select($r, $w, $e, 0)) {
echo
"stream_select() falló\n";
}
?>

Nota:

Si ha escrito o leído en un flujo que es retornado en los arrays de flujos, sea consciente de que estos flujos pueden no haber escrito o leído la totalidad de los datos solicitados. Sea capaz de leer un solo byte.

Nota:

Algunos flujos (como zlib) no pueden ser seleccionados por esta función.

Nota: Compatibilidad con Windows

Utilizar la función stream_select() en un puntero de archivo retornado por proc_open() fallará y retornará false en Windows.

STDIN desde una consola cambia su estado tan pronto como cualquier evento de entrada esté disponible, pero leer desde un flujo puede seguir siendo bloqueante.

Ver también