stream_select

(PHP 4 >= 4.3.0)

stream_select -- Runs the equivalent of the select() system call on the given arrays of streams with a timeout specified by tv_sec and tv_usec

Description

int stream_select ( resource &read, resource &write, resource &except, int tv_sec [, int tv_usec])

stream_select() accepte un tableau de flux et attend que l'un d'entre eux change de statut. Cette opération est équivalente à ce que fait la fonction socket_select(), ormis le fait qu'elle travaille sur flux.

Les flux qui sont listés dans le paramètre read seront surveillés en lecture, c'est à dire si de nouveaux octets sont disponibles en lecture (pour être précis, si une lecture ne bloquera pas, ce qui inclut aussi les flux qui sont en fin de fichier, auquel cas un appel à la fonction fread() retournera une chaîne de taille 0).

Les flux qui sont listés dans le paramètre write seront surveillé en écriture (pour être précis, si une écriture ne bloquera pas).

Les flux qui sont listés dans le paramètre except seront surveillé pour voir si une exception est levée.

Avertissement

Lors de la fin de la fonction, les tableaux sont modifiés pour rapporter leurs évolutions respectives.

Vous n'êtes pas obligés de passer tous les tableaux à la fonction stream_select(). Vous pouvez en omettre certains, en utilisant un tabeau vide ou la valeur NULL. N'oubliez pas que ces tableaux sont passés par référence et qu'ils seront modifiés lorsque stream_select() s'achèvera.

Exemple
<?php
/* Preparation du tableau de flux lecture */
$read = array($stream1, $stream2);

if (
false === ($num_changed_streams = stream_select($read, $write = NULL, $except = NULL, 0))) {
    
/* Gestion d'erreur */
else if ($num_changed_streams > 0) {
    
/* Au moins un des flux a &eacute;volu&eacute;  */
}
?>

Note : A cause d'une limitation du Zend Engine actuel, il n'est pas possible de passer la valeur NULL directement comme paramètre d'une fonction qui s'attend à des paramètres passés par référence. Au lieu de cela, il est recommandé d'utiliser une variable temporaire, ou une expression don le membre de gauche est une variable temporaire. Comme ceci :
<?php
  stream_select
($r, $w, $e = NULL, 0);
?>

Les paramètres tv_sec et tv_usec ensemle forment le délai d'expiration. Ce délai est la durée maximale d'exécution de stream_select(). tv_sec peut valoir zéro, ce qui fait que stream_select() s'achève immédiatement. C'est pratique pour réaliser du polling. Si tv_sec est NULL (pas de délai d'expiration), stream_select() peut bloquer le script indéfiniment.

En cas de succès, stream_select() retourne le nomre de flux qui ont évolué, ce qui peut être zéro si le délai d'expiration a été atteint avant que les flux n'évoluent. En cas d'erreur, la fonction retourne FALSE.

Note : Assurez vous de bien utiliser l'opérateur === lorsque vous recherchez des erreurs. Comme stream_select() peut retourner 0, une comparaison effectuée à l'aide de == la confondrait avec une erreur.
<?php
if (false === stream_select($r, $w, $e = NULL, 0)) {
    echo
"stream_select() failed\n";
}
?>

Note : Gardez à l'esprit que certaines implémentations de flux doivent être gérées très prudemment. Voici quelques règles à suivre :

  • Il faut toujours essayer d'utiliser stream_select() sans délai d'expiration. Votre programme ne devrait rien faire si il ne reçoit pas de données extérieures. Les codes qui dépendent du délai d'expiration ne sont généralement pas portable, et difficiles à déboguer.

  • Si vous avez écrit ou lu dans un flux qui retournés dans les tableaux de flux, soyez bien conscient que ces flux n'ont peut être pas écrit ou lu la totalité des données demandées. Soyez préparés à être en mesure de lire un seul octet.

Voir aussi stream_set_blocking().