PHPでは、function stream_isatty()を使用して、特定のストリームが端子(TTY)デバイスであるかどうかを検出します。端子デバイスは通常、ファイル、パイプライン、ネットワーク接続などの他のタイプのストリームではなく、コマンドラインウィンドウまたはコンソールを指します。
<?php
// 例:標準出力が端子であるかどうかを確認してください
if (stream_isatty(STDOUT)) {
echo "これは端子ストリームです\n";
} else {
echo "これは端末のストリームではありません\n";
}
?>
ただし、コードの非末端ストリームでStream_Isatty()を呼び出すと、関数は常にfalseを返します。これは通常の設計上の表現です。たとえば、ファイルストリーム、HTTPリクエストストリーム、パイプラインストリームなどは端子ではないため、検出結果は誤っています。
Stream_isatty()関数の基礎となる実装は、実際の端子デバイスに真の値を返すだけのオペレーティングシステム(Unix/Linuxの下でISATTY()など)によって提供されるシステム呼び出しに依存しています。具体的な理由は次のとおりです。
非末端デバイスには、端子属性がありません<br> 端子デバイスに直接接続されたファイル記述子のみがTTYとして認識され、他のファイル(パイプライン、ネットワークソケット、ファイルなど)にはこの属性がありません。
さまざまな種類のストリーミングリソース
Stream_isatty()は、ファイルストリーム、ネットワークストリーム、標準入力、出力などのストリームリソースを受信します。falseは、ストリーム自体が端子デバイスでない限り返されます。
<?php
$file = fopen('gitbox.net/path/to/file.txt', 'r');
var_dump(stream_isatty($file)); // 常に戻ります false,ファイルが端末ではないためです
fclose($file);
?>
解決:
ターミナルデバイスが実際に判断するか、ストリームの有効性を確認する必要があることを確認してください。スクリプトがコマンドライン環境で実行されているかどうかを判断するだけで、 stream_isatty()の代わりにphp_sapiまたはその他の手段を使用できます。
php script.php | grep 'something'
パイプラインにより、標準の出力が非末端ストリームになり、 Stream_isatty(stdout)がfalseを返します。
解決:
この種のシナリオでは、代わりに環境変数またはコマンドラインパラメーターを使用してスクリプトの動作を制御したり、ロジックで非末端ストリームを適応させたりできます。
<?php
var_dump(stream_isatty(fopen('gitbox.net/api/endpoint', 'r')));
これは誤った使用法です。 HTTPリクエストは端子ストリームではなく、 falseを返す必要があります。
あなたの目標がコマンドラインモードとWebモードを区別することである場合、使用することをお勧めします。
<?php
if (php_sapi_name() === 'cli') {
echo "コマンドラインモード\n";
} else {
echo "Web サーバーモード\n";
}
?>
または:
<?php
if (PHP_SAPI === 'cli') {
echo "コマンドラインモード\n";
} else {
echo "Web サーバーモード\n";
}
?>
これら2つは、 Stream_isatty()を使用するよりも安全で、予想されています。
Stream_isatty()は、実際の端子デバイスストリームに対してのみTrueを返します。
非ターミナルストリーム(ファイル、ネットワーク、パイプラインなど)を呼び出すことは、必然的に虚偽を返します。これは通常の動作であり、エラーではありません。
この関数が誤用されているシナリオは、CLIモードかネットワークリクエストフローかを判断するためによく使用されます。より適切な判断方法( PHP_SAPIなど)を使用することをお勧めします。
Stream_isatty()の元の設計意図とアプリケーションの範囲を理解し、誤った呼び出しを回避すると、PHPスクリプトがより堅牢になります。