stream_select
PHP Manual
PHP Manual»Funciones de Flujos»stream_select

stream_select

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

stream_select — Supervisa la modificación de uno o varios flujos

Descripción

function 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. Es el equivalente de socket_select() para los flujos, pero ambas funciones no se comportan igual en todos los aspectos: no señalan los argumentos inválidos de la misma manera, y stream_select() puede terminar sin consultar en absoluto al sistema operativo, tal como se describe en las notas siguientes.

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 está definido a 0 y microseconds vale 0 o null, 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:

Al leer de un flujo devuelto en los arrays, o al escribir en él, tenga en cuenta que no se lee ni se escribe necesariamente la totalidad de los datos solicitados. Esté preparado para tratar tan solo un byte.

Nota:

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

Nota:

Un flujo que ya dispone de datos almacenados en el búfer del lado de PHP se señala como listo sin que se realice la llamada select() subyacente. En ese caso, los arrays write y except se vacían sin haber sido examinados: un flujo que estaba listo para escritura no se señala, y el valor de retorno solo cuenta los flujos disponibles para lectura.

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.

Véase también

To Top