(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)
stream_select — Surveille la modification d'un ou plusieurs flux
&$read,&$write,&$except,$seconds,$microseconds = nullstream_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.
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.
      
Note:
Lorsque stream_select() se termine, les tableaux
read,writeetexceptsont 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.
      
   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).
  
| Version | Description | 
|---|---|
| 8.1.0 | microsecondsest désormais nullable. | 
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é  */
}
?>
Note:
À cause d'une limitation du moteur Zend actuel, il n'est pas possible de passer la valeur
nulldirectement 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: Compabilité Windows
Utiliser la fonction stream_select() sur un pointeur de fichier retourné par proc_open() échouera et retournera
falsesous Windows.
STDINfdepuis 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.