7.100 Flôts
7 Index des fonctions
Manuel PHP
. Introduction . Filtres de flôts . Contextes de flôts . Installation . Classes Stream . Constantes prédefinies . Erreurs de flôts . Exemples . stream_context_create . stream_context_get_options . stream_context_set_option . stream_context_set_params . stream_copy_to_stream . stream_filter_append . stream_filter_prepend . stream_filter_register . stream_get_filters . stream_get_line . stream_get_meta_data . stream_get_transports . stream_get_wrappers . stream_register_wrapper ->stream_select . stream_set_blocking . stream_set_timeout . stream_set_write_buffer . stream_socket_accept . stream_socket_client . stream_socket_get_name . stream_socket_server . stream_wrapper_register
|
7.100.23 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 [ Exemples avec stream_select ] PHP 4 >= 4.3.0
int
stream_select (
resource
&read
,
resource
&write
,
resource
&except
,
int
tv_sec
,
int
tv_usec
)
stream_select
accepte un tableau de flôts 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 flôts.
Les flôts 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 flôts qui sont en fin de fichier, auquel cas un appel à la fonction
fread
retournera une chaîne de taille 0).
Les flôts qui sont listés dans le paramètre
write
seront surveillé en écriture (pour être précis, si une écriture ne
bloquera pas).
Les flôts qui sont listés dans le paramètre
except
seront surveillé pour voir si une exception est levée.
Attention |
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 flôts 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 flôts a évolué */ } ?>
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
flôts qui ont évolué, ce qui peut être zéro si le délai d'expiration
a été atteint avant que les flôts 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 flôts 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 flôt qui retournés dans les tableaux
de flôts, soyez bien conscient que ces flôts 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
.
|