8.126 Flux
8 Référence des fonctions
Manuel PHP
. Introduction . Filtres de flux . Contextes de flux . Installation . Classes Stream . Constantes pré-définies . Erreurs de flux . Exemples . stream_bucket_append . stream_bucket_make_writeable . stream_bucket_new . stream_bucket_prepend . stream_context_create . stream_context_get_default . 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_filter_remove . stream_get_contents . 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_enable_crypto . stream_socket_get_name . stream_socket_pair . stream_socket_recvfrom . stream_socket_sendto . stream_socket_server . stream_wrapper_register . stream_wrapper_restore . stream_wrapper_unregister
|
8.126.30 stream_select()Retourne l'équivalent de l'appel système select() sur un tableau
de flux avec un délai d'expiration spécifié par tv_sec et tv_usec[ Exemples avec stream_select ] PHP 4 >= 4.3.0, PHP 5
int
stream_select (
array
read
,
array
write
,
array
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
, hormis le fait qu'elle
travaille sur un 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és 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és pour voir si une exception est levée.
| Note | |
Lorsque
stream_select
se termine, les tableaux
read
,
write
et
except
sont modifiés pour indiquer quel flux
ont actuellement changé de statut.
|
Les paramètres
tv_sec
et
tv_usec
forment le
délai d'expiration
,
tv_sec
spécifie le nombre de secondes tandis que
tv_usec
, 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
tv_sec
et
tv_usec
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
tv_sec
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).
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).
| Attention | |
Utiliser comme délai d'expiration une valeur de
0
vous permet de renvoyer instantanément
le statut des flux, sinon, ce
n'est pas
une bonne idée d'utiliser une valeur de
0
dans une
boucle, ce qui ferait que votre script consommerait beaucoup trop de temps processeur.
Il est préférable de spécifier une valeur de délai d'expiration de quelques secondes. Même
si vous avez besoin d'exécuter d'autres codes en même temps, l'utilisation d'un délai d'expiration
de moins de
200000
microsecondes devrait vous aider à réduire le temps
processeur de votre script.
Souvenez-vous que le délai d'expiration représente le temps maximal qui s'écoulera ;
stream_select
se terminera dès que les flux désirés seront prêts à
être utilisés.
|
Vous n'êtes pas obligé de passer tous les tableaux à la fonction
stream_select
. Vous pouvez en omettre certains,
en utilisant un tableau 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.
Cet exemple surveille si des données arrivent pour être lues soit dans
$stream1
, soit dans
$stream2
.
Si le délai d'expiration vaut
0
, la fonction se terminera immédiatement :
<?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 */ } elseif ($num_changed_streams > 0) { /* Au moins un des flux a évolué */ } ?>
| Note | |
A 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 :
<?php stream_select($r, $w, $e = NULL, 0); ?>
|
| 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
==
l'évaluerait à
TRUE
:
<?php if (false === stream_select($r, $w, $e = NULL, 0)) { echo "stream_select() failed\n"; } ?>
|
| Note | |
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.
|
| Note | |
Notes aux utilisateurs de Windows :
stream_select
utilisé sur une pipe retournée par
proc_open
peut causer la perte de données sous Windows 98.
Utiliser la fonction
stream_select
sur un descripteur de fichier retourné par
proc_open
échoura et retournera
FALSE
sous Windows.
|
Voir aussi
stream_set_blocking
.
|