stream_select
Surveille la modification d'un ou plusieurs flux
&reftitle.description;
intfalsestream_select
arraynullread
arraynullwrite
arraynullexcept
intnullseconds
intnullmicroseconds&null;
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,
hormis le fait qu'elle travaille sur un flux.
&reftitle.parameters;
read
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).
write
Les flux qui sont listés dans le paramètre write
seront surveillés en écriture (pour être précis, si une écriture ne
bloquera pas).
except
Les flux qui sont listés dans le paramètre except
seront surveillés pour voir si une exception est levée.
Lorsque stream_select se termine, les tableaux
read, write et
except sont modifiés pour indiquer quels flux
ont actuellement changé de statut.
Les clés originales du tableau sont préservées.
seconds
Les paramètres seconds et
microseconds
forment le délai d'expiration,
seconds spécifie le nombre de secondes
tandis que microseconds, le nombre de
microsecondes. Le paramètre timeout
représente la limite supérieure du temps que
stream_select doit attendre avant de
se terminer. Si seconds et
microseconds sont tous les deux définis
à 0, , stream_select n'attendra
pas de données - à la place, elle se terminera immédiatement,
indiquant le statut courant du flux.
Si seconds vaut &null;,
stream_select peut se bloquer indéfiniment,
se terminant uniquement lorsqu'un événement sur un des flux surveillés
survient (ou si un signal interrompt l'appel système).
Utiliser un valeur de 0 vous permet de
tester instantanément le statut des flux, mais il faut savoir
qu'il n'est pas recommandé d'utiliser 0
dans une boucle, car cela va faire consommer énormément de
processeur à votre script.
Il est bien mieux de spécifier une valeur de quelques secondes, même
si vous devez surveiller et exécuter différents codes de manière
simultanée. Par exemple, utiliser une valeur d'au moins
200000 microsecondes, vous réduirez considérablement
la consommation processeur de votre script.
N'oubliez pas que la valeur d'expiration est la durée maximale
d'attente, si rien ne se passe : stream_select
retournera un résultat dès que l'un des flux soumis est prêt à
l'utilisation.
microseconds
Voyez la description de seconds.
&reftitle.returnvalues;
En cas de succès, stream_select retourne
le nombre de flux qui ont évolué, ce qui peut être 0, si
le délai d'expiration a été atteint avant que les flux n'évoluent.
En cas d'erreur, la fonction retournera &false; et un
avertissement sera renvoyé (cela peut apparaître si l'appel
système est interrompu par un signal entrant).
&reftitle.changelog;
&Version;
&Description;
8.1.0
microseconds est désormais nullable.
&reftitle.examples;
Exemple avec stream_select
Cet exemple surveille si des données arrivent pour être
lues soit dans $stream1, soit dans
$stream2. Si le délai d'expiration
vaut &zero;, la fonction se termine immédiatement :
0) {
/* Au moins un des flux a évolué */
}
?>
]]>
&reftitle.notes;
À cause d'une limitation du moteur Zend 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
dont le membre de gauche est une variable temporaire. Comme ceci :
]]>
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 ==
l'évaluerait à &true; :
]]>
Si vous avez écrit ou lu dans un flux qui est retourné 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 en
mesure de lire un seul octet.
Quelques flux (comme zlib) ne peuvent pas être
sélectionnés par cette fonction.
Compabilité Windows
Utiliser la fonction stream_select
sur un pointeur de fichier retourné par proc_open
échouera et retournera &false; sous Windows.
STDIN fdepuis une console change son statut dés que
n'importe quel évenements d'entrées sont disponible,
mais lire depuis un flux peut toujours être bloquant.
&reftitle.seealso;
stream_set_blocking