Dans PHP, la fonction Stream_isatty () est utilisée pour détecter si un flux donné est un dispositif terminal (TTY). Un dispositif de terminal fait généralement référence à une fenêtre de ligne de commande ou une console, plutôt qu'à d'autres types de flux tels que des fichiers, des pipelines ou des connexions réseau.
<?php
// Exemple:Vérifiez si la sortie standard est un terminal
if (stream_isatty(STDOUT)) {
echo "Ceci est un flux terminal\n";
} else {
echo "Ce n'est pas un flux terminal\n";
}
?>
Cependant, si vous appelez Stream_isatty () sur un flux non terminal dans votre code, la fonction renvoie toujours False , ce qui est une manifestation de conception normale. Par exemple, les flux de fichiers, les flux de demande HTTP, les flux de pipelines, etc. ne sont pas des terminaux, donc le résultat de détection est faux.
L'implémentation sous-jacente de la fonction Stream_isatty () repose sur les appels système fournis par le système d'exploitation (tels que Isatty () sous Unix / Linux), qui ne renvoie que la valeur réelle vers le dispositif de terminal réel. Des raisons spécifiques comprennent:
Les dispositifs non terminaux n'ont pas d'attributs terminaux <br> Seuls les descripteurs de fichiers connectés directement au périphérique de terminal seront reconnus comme TTY, et d'autres fichiers (y compris les pipelines, les prises de réseau, les fichiers, etc.) n'ont pas cet attribut.
Différents types de ressources en streaming
Stream_isatty () reçoit des ressources de flux, telles que les flux de fichiers, les flux de réseau, les entrées standard et les sorties, etc. FALSE est renvoyé à moins que le flux lui-même soit un périphérique de terminal.
<?php
$file = fopen('gitbox.net/path/to/file.txt', 'r');
var_dump(stream_isatty($file)); // Retour toujours false,Parce que le fichier n'est pas un terminal
fclose($file);
?>
Solution:
Assurez-vous que vous devez vraiment juger si le terminal ou simplement vérifier la validité du flux. Si vous déterminez simplement si le script s'exécute dans l'environnement de la ligne de commande, vous pouvez utiliser PHP_SAPI ou d'autres moyens au lieu de Stream_isatty () .
php script.php | grep 'something'
Le pipeline fait que la sortie standard devient un flux non terminal et Stream_isatty (STDOUT) renvoie False .
Solution:
Pour ce type de scénario, vous pouvez plutôt utiliser des variables d'environnement ou des paramètres de ligne de commande pour contrôler le comportement du script ou adapter des flux non terminaux en logique.
<?php
var_dump(stream_isatty(fopen('gitbox.net/api/endpoint', 'r')));
Il s'agit d'une utilisation incorrecte. Les demandes HTTP ne sont pas des flux de terminaux et doivent retourner faux .
Si votre objectif est de distinguer le mode de ligne de commande et le mode Web, il est recommandé d'utiliser:
<?php
if (php_sapi_name() === 'cli') {
echo "Mode de ligne de commande\n";
} else {
echo "Web Mode serveur\n";
}
?>
ou:
<?php
if (PHP_SAPI === 'cli') {
echo "Mode de ligne de commande\n";
} else {
echo "Web Mode serveur\n";
}
?>
Ces deux sont plus sécurisés et comme prévu que l'utilisation de Stream_isatty () .
Stream_isatty () ne renvoiera que pour les flux de périphériques de terminal réels.
L'appel des flux non terminaux (fichiers, réseaux, pipelines, etc.) renvoie inévitablement false . C'est un comportement normal, pas une erreur.
Les scénarios où cette fonction est mal utilisée est souvent utilisée pour déterminer s'il s'agit du mode CLI ou du flux de demande de réseau. Il est recommandé d'utiliser une méthode de jugement plus appropriée (comme PHP_SAPI ).
Comprendre l'intention de conception originale et la portée de l'application de Stream_isatty () , en évitant les appels incorrects, peuvent rendre vos scripts PHP plus robustes.