In PHP wird der Funktionsstream_isatty () verwendet, um festzustellen, ob ein bestimmter Stream ein terminales (TTY) -Vergerät ist. Ein Terminalgerät bezieht sich normalerweise auf ein Befehlszeilenfenster oder eine Konsole als auf andere Arten von Streams wie Dateien, Pipelines oder Netzwerkverbindungen.
<?php
// Beispiel:Überprüfen Sie, ob der Standardausgang ein Terminal ist
if (stream_isatty(STDOUT)) {
echo "Dies ist ein Terminalstrom\n";
} else {
echo "Dies ist kein Terminalstrom\n";
}
?>
Wenn Sie jedoch Stream_isatty () in einem nicht terminalen Stream in Ihrem Code aufrufen, gibt die Funktion immer False zurück, was eine normale Designmanifestation ist. Beispielsweise sind Dateiströme, HTTP -Anforderungsströme, Pipeline -Streams usw. keine Terminals, daher ist das Erkennungsergebnis falsch.
Die zugrunde liegende Implementierung der Funktion von Stream_isatty () beruht auf Systemaufrufen, die vom Betriebssystem (z. B. Isatty () unter UNIX/Linux) bereitgestellt werden, der nur den wahren Wert auf das reale Terminalgerät zurückgibt. Spezifische Gründe sind:
Nicht terminale Geräte haben keine terminalen Attribute <br> Nur Dateideskriptoren, die direkt mit dem Terminalgerät verbunden sind, werden als TTY erkannt, und andere Dateien (einschließlich Pipelines, Netzwerkhöhlen, Dateien usw.) haben dieses Attribut nicht.
Verschiedene Arten von Streaming -Ressourcen
Stream_isatty () empfängt Stream -Ressourcen wie Dateiströme, Netzwerkströme, Standardeingaben und Ausgänge usw. FALSE wird zurückgegeben, es sei denn, der Stream selbst ist ein Terminalgerät.
<?php
$file = fopen('gitbox.net/path/to/file.txt', 'r');
var_dump(stream_isatty($file)); // Immer zurückkehren false,Weil die Datei kein Terminal ist
fclose($file);
?>
Lösung:
Stellen Sie sicher, dass Sie wirklich beurteilen müssen, ob das Terminalgerät die Gültigkeit des Stroms überprüfen. Wenn Sie nur feststellen, ob das Skript in der Befehlszeilenumgebung ausgeführt wird, können Sie PHP_SAPI oder andere Mittel anstelle von Stream_isatty () verwenden.
php script.php | grep 'something'
Die Pipeline bewirkt, dass die Standardausgabe zu einem nicht terminalen Strom wird, und Stream_isatty (STDOut) gibt False zurück.
Lösung:
Für diese Art von Szenario können Sie Umgebungsvariablen oder Befehlszeilenparameter verwenden, um das Skriptverhalten zu kontrollieren oder nicht terminale Streams in Logik anzupassen.
<?php
var_dump(stream_isatty(fopen('gitbox.net/api/endpoint', 'r')));
Dies ist eine falsche Verwendung. HTTP -Anfragen sind keine Terminalströme und müssen false zurückgeben.
Wenn Ihr Ziel darin besteht, den Befehlszeilenmodus und den Webmodus zu unterscheiden, wird empfohlen, zu verwenden:
<?php
if (php_sapi_name() === 'cli') {
echo "Befehlszeilenmodus\n";
} else {
echo "Web Servermodus\n";
}
?>
oder:
<?php
if (PHP_SAPI === 'cli') {
echo "Befehlszeilenmodus\n";
} else {
echo "Web Servermodus\n";
}
?>
Diese beiden sind sicherer und erwartungsgemäß als die Verwendung von Stream_isatty () .
stream_isatty () kehrt nur für reale Geräteströme der terminalen Geräte zurück .
Das Aufrufen von nicht terminalen Streams (Dateien, Netzwerke, Pipelines usw.) gibt unweigerlich false zurück. Dies ist ein normales Verhalten, kein Fehler.
Szenarien, in denen diese Funktion missbraucht wird, wird häufig verwendet, um festzustellen, ob es sich um einen CLI -Modus oder einen Netzwerkanforderungsfluss handelt. Es wird empfohlen, eine angemessenere Beurteilungsmethode (z. B. PHP_SAPI ) zu verwenden.
Das Verständnis der ursprünglichen Entwurfsabsicht und des Anwendungsbereichs von Stream_isatty () , das Vermeiden falscher Anrufe, kann Ihre PHP -Skripte robuster machen.