Lorsque vous écrivez des scripts de ligne de commande dans PHP, vous pouvez rencontrer une situation où Stream_isatty renvoie FALSE, ce qui entraînera la confusion du contenu de sortie ou non conformément aux attentes. Ce problème se produit généralement lorsque la sortie du script fonctionne différemment dans différents environnements, en particulier lors de la sortie via certaines bornes ou via des pipelines. Cet article explorera les causes profondes de ce problème et fournira certaines solutions pour aider les développeurs à éviter les problèmes de sortie.
Stream_isatty est une fonction de PHP pour détecter si un flux est associé à un terminal. Le prototype de fonction est le suivant:
<span><span><span class="hljs-keyword">bool</span></span><span> </span><span><span class="hljs-title function_ invoke__">stream_isatty</span></span><span> ( resource </span><span><span class="hljs-variable">$stream</span></span><span> )
</span></span>
Cette fonction accepte une ressource de flux en tant que paramètre et détermine si le flux est connecté à un terminal. Si le flux est sorti via le périphérique de terminal, la valeur de retour est vraie , sinon false est renvoyé.
Lorsque Stream_isatty renvoie False, cela signifie que la sortie du script PHP n'est pas écrite directement sur un terminal, mais peut être transmise par des pipelines, des fichiers ou d'autres moyens. À ce stade, le script PHP peut formater la sortie (par exemple, le texte avec couleur) ou les caractères de contrôle de sortie en fonction de la méthode de sortie.
Sans traitement approprié, la sortie peut devenir déroutante, surtout lorsque le script s'exécute sans terminal, les caractères de contrôle des couleurs ou les caractères formatés peuvent apparaître comme des caractères brouillés ou invisibles.
La ligne de commande sort des caractères formatés :
De nombreux outils de ligne de commande tels que Echo ou Printf prennent en charge la sortie formatée, y compris le texte de couleur et le gras, l'italique et d'autres formats. Ces caractères formatés peuvent être affichés correctement sur les terminaux pris en charge, mais dans des environnements qui ne prennent pas en charge ces fonctionnalités, telles que des fichiers ou des pipelines, les caractères seront affichés directement sous forme de brouillage.
Détection automatique de l'environnement terminal :
Dans un environnement terminal, PHP peut détecter et sortir correctement le texte de couleur. Cependant, lorsque la sortie du script est redirigé vers un fichier ou un pipeline, les informations sur l'environnement du terminal sont perdues et Stream_isatty renvoie false, ce qui entraîne la sortie du script qui n'est pas correctement traité.
Problèmes de compatibilité multiplateforme :
Différents systèmes d'exploitation gèrent différemment les terminaux et les flux. Par exemple, sur Windows, les terminaux peuvent ne pas prendre en charge les séquences d'échappement ANSI, mais dans Linux ou MacOS, ces séquences sont généralement prises en charge. De cette façon, les problèmes de compatibilité entre différentes plates-formes peuvent conduire à des formats de sortie incohérents.
Afin de résoudre le problème de sortie lorsque Stream_isatty renvoie False, nous pouvons adopter les solutions suivantes:
Le moyen le plus direct est d'utiliser Stream_isatty pour détecter si le flux de sortie du script actuel est associé au terminal. S'il s'agit de sortie de terminal, vous pouvez continuer à utiliser des caractères de couleur et de format; S'il ne s'agit pas de sortie terminale, évitez ces caractères de format. Il peut être géré par le code suivant:
<span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">stream_isatty</span></span><span>(STDOUT)) {
</span><span><span class="hljs-comment">// Environnement terminal,Autoriser la sortie de la couleur</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"\033[32mC'est le texte vert\033[0m\n"</span></span><span>; </span><span><span class="hljs-comment">// ANSICode couleur</span></span><span>
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-comment">// 非Environnement terminal,Évitez de sortir des caractères de contrôle</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"C'est du texte normal\n"</span></span><span>;
}
</span></span>
Cette approche peut bien résoudre le problème dans certains scénarios, garantissant qu'il n'y a pas de caractères de contrôle lorsque la sortie du pipeline ou du fichier s'affiche.
Certaines bibliothèques PHP peuvent nous aider à mieux contrôler la sortie de la ligne de commande, y compris la détection automatique des environnements et le traitement des caractères formatés. Par exemple, Symfony / Console fournit des fonctions de contrôle de sortie riches, qui peuvent gérer automatiquement la sortie formatée de la ligne de commande.
<span><span>composer require symfony/console
</span></span>
Puis utilisez-le dans des scripts PHP:
<span><span><span class="hljs-keyword">use</span></span><span> </span><span><span class="hljs-title">Symfony</span></span><span>\</span><span><span class="hljs-title">Component</span></span><span>\</span><span><span class="hljs-title">Console</span></span><span>\</span><span><span class="hljs-title">Output</span></span><span>\</span><span><span class="hljs-title">ConsoleOutput</span></span><span>;
</span><span><span class="hljs-variable">$output</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">ConsoleOutput</span></span><span>();
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$output</span></span><span>-></span><span><span class="hljs-title function_ invoke__">isVerbose</span></span><span>()) {
</span><span><span class="hljs-variable">$output</span></span><span>-></span><span><span class="hljs-title function_ invoke__">writeln</span></span><span>(</span><span><span class="hljs-string">"<info>C'est le texte vert</info>"</span></span><span>); </span><span><span class="hljs-comment">// Ajouter automatiquement les couleurs</span></span><span>
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-variable">$output</span></span><span>-></span><span><span class="hljs-title function_ invoke__">writeln</span></span><span>(</span><span><span class="hljs-string">"C'est du texte normal"</span></span><span>);
}
</span></span>
La bibliothèque de consoles Symfony peut déterminer automatiquement s'il faut utiliser la sortie formatée dans différents environnements, réduisant ainsi les tracas du jugement manuel.
Si vous ne souhaitez pas utiliser de bibliothèques externes, vous pouvez également contrôler manuellement le formatage du texte. Dans certains cas, vous voudrez peut-être sortir du texte brut uniquement sans les caractères de mise en forme, vous pouvez définir une variable au début du script spécifiquement pour contrôler l'opportunité d'activer la couleur ou de formater la sortie:
<span><span><span class="hljs-variable">$isTerminal</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_isatty</span></span><span>(STDOUT);
</span><span><span class="hljs-variable">$colorStart</span></span><span> = </span><span><span class="hljs-variable">$isTerminal</span></span><span> ? </span><span><span class="hljs-string">"\033[32m"</span></span><span> : </span><span><span class="hljs-string">""</span></span><span>;
</span><span><span class="hljs-variable">$colorEnd</span></span><span> = </span><span><span class="hljs-variable">$isTerminal</span></span><span> ? </span><span><span class="hljs-string">"\033[0m"</span></span><span> : </span><span><span class="hljs-string">""</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$colorStart</span></span><span> . </span><span><span class="hljs-string">"C'est le texte vert"</span></span><span> . </span><span><span class="hljs-variable">$colorEnd</span></span><span> . </span><span><span class="hljs-string">"\n"</span></span><span>;
</span></span>
De cette façon, le comportement de sortie du script dans les environnements terminaux et non terminaux peut être contrôlé avec précision.
Si le problème est complexe ou si la configuration de l'environnement est incertaine, vous pouvez utiliser le journal de débogage pour aider à analyser le problème. En diffusant certaines informations sur l'environnement, nous pouvons comprendre la situation spécifique du script PHP en cours d'exécution:
<span><span><span class="hljs-title function_ invoke__">var_dump</span></span><span>(</span><span><span class="hljs-title function_ invoke__">stream_isatty</span></span><span>(STDOUT)); </span><span><span class="hljs-comment">// Vérifiez si le flux de sortie est associé au terminal</span></span><span>
</span></span>
Cela aide à clarifier le comportement spécifique de la sortie pendant le développement.
Lorsque Stream_isatty renvoie False, les scripts PHP peuvent rencontrer des problèmes de formatage de sortie. Pour éviter ces problèmes, nous pouvons assurer la compatibilité des scripts en détectant l'environnement terminal, en utilisant des bibliothèques externes ou en contrôlant manuellement le format de sortie. Que ce soit en jugeant l'environnement, en utilisant la sortie des couleurs ou en choisissant une bibliothèque d'outils appropriée, il peut réduire efficacement le chaos du format de sortie dans différents environnements.
Grâce à ces méthodes, nous pouvons nous assurer que lors du développement de scripts de ligne de commande, nous pouvons non seulement nous adapter à différents environnements de sortie, mais également fournir aux utilisateurs une meilleure expérience utilisateur.