stream_select
(PHP 4 >= 4.3.0, PHP 5, PHP 7)
stream_select — Surveille la modification d'un ou plusieurs flux
Description
&$read
, array &$write
, array &$except
, int $tv_sec
[, int $tv_usec
= 0
] )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.
Liste de paramètres
-
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.
Vous n'êtes pas obligés de remplir tous les tableaux arguments de la fonction stream_select(). Vous pouvez les laisser et utiliser un tableau vide, ou encoreNote:
Lorsque stream_select() se termine, les tableaux
read
,write
etexcept
sont modifiés pour indiquer quels flux ont actuellement changé de statut.NULL
. De plus, n'oubliez pas que ces tableaux sont passés par référence et seront modifiés une fois que stream_select() s'achève. -
tv_sec
-
Les paramètres
tv_sec
ettv_usec
forment le délai d'expiration,tv_sec
spécifie le nombre de secondes tandis quetv_usec
, le nombre de microsecondes. Le paramètretimeout
représente la limite supérieure du temps que stream_select() doit attendre avant de se terminer. Sitv_sec
ettv_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
vautNULL
, 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).AvertissementUtiliser 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.
-
tv_usec
-
Voyez la description de
tv_sec
.
Valeurs de retour
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).
Exemples
Exemple #1 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 0, la fonction se termine immédiatement :
<?php
/* Preparation du tableau de flux lecture */
$read = array($stream1, $stream2);
$write = NULL;
$except = NULL;
if (false === ($num_changed_streams = stream_select($read, $write, $except, 0))) {
/* Gestion d'erreur */
} elseif ($num_changed_streams > 0) {
/* Au moins un des flux a évolué */
}
?>
Notes
Note:
À 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
$e = NULL;
stream_select($r, $w, $e, 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
$e = NULL;
if (false === stream_select($r, $w, $e, 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:
Quelques flux (comme zlib) ne peuvent pas être sélectionnés par cette fonction.
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 pointeur de fichier retourné par proc_open() échouera et retournera
FALSE
sous Windows.
Version en cache
23/12/2024 08:49:24 Cette version de la page est en cache (à la date du 23/12/2024 08:49:24) afin d'accélérer le traitement. Vous pouvez activer le mode utilisateur dans le menu en haut pour afficher la dernère version de la page.Document créé le 30/01/2003, dernière modification le 26/10/2018
Source du document imprimé : https://www.gaudry.be/php-rf-stream-select.html
L'infobrol est un site personnel dont le contenu n'engage que moi. Le texte est mis à disposition sous licence CreativeCommons(BY-NC-SA). Plus d'info sur les conditions d'utilisation et sur l'auteur.
Références
Ces références et liens indiquent des documents consultés lors de la rédaction de cette page, ou qui peuvent apporter un complément d'information, mais les auteurs de ces sources ne peuvent être tenus responsables du contenu de cette page.
L'auteur de ce site est seul responsable de la manière dont sont présentés ici les différents concepts, et des libertés qui sont prises avec les ouvrages de référence. N'oubliez pas que vous devez croiser les informations de sources multiples afin de diminuer les risques d'erreurs.