php에서, stream_isatty () 함수는 주어진 스트림이 터미널 (TTY) 장치인지 여부를 감지하는 데 사용됩니다. 터미널 장치는 일반적으로 파일, 파이프 라인 또는 네트워크 연결과 같은 다른 유형의 스트림이 아닌 명령 줄 창 또는 콘솔을 나타냅니다.
<?php
// 예:표준 출력이 터미널인지 확인하십시오
if (stream_isatty(STDOUT)) {
echo "이것은 터미널 스트림입니다\n";
} else {
echo "이것은 터미널 스트림이 아닙니다\n";
}
?>
그러나 코드의 비 터미널 스트림에서 stream_isatty ()를 호출하면 함수는 항상 False를 반환합니다. 이는 정상적인 설계 증상입니다. 예를 들어, 파일 스트림, HTTP 요청 스트림, 파이프 라인 스트림 등은 단자가 아니므로 감지 결과는 False입니다.
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를 반환해야합니다.
목표 라인 모드와 웹 모드를 구별하는 것이 목표라면 다음을 사용하는 것이 좋습니다.
<?php
if (php_sapi_name() === 'cli') {
echo "명령 줄 모드\n";
} else {
echo "Web 서버 모드\n";
}
?>
또는:
<?php
if (PHP_SAPI === 'cli') {
echo "명령 줄 모드\n";
} else {
echo "Web 서버 모드\n";
}
?>
이 두 가지는 Stream_isatty ()를 사용하는 것보다 더 안전하고 예상대로 예상됩니다.
Stream_isatty ()는 실제 터미널 장치 스트림에 대해서만 true를 반환합니다.
비 터미널 스트림 (파일, 네트워크, 파이프 라인 등)으로 호출하면 필연적으로 False가 반환됩니다. 이것은 오류가 아니라 정상적인 동작입니다.
이 기능이 잘못 사용되는 시나리오는 종종 CLI 모드인지 네트워크 요청 흐름인지 여부를 결정하는 데 사용됩니다. 보다 적절한 판단 방법 (예 : PHP_SAPI )을 사용하는 것이 좋습니다.
원래 설계 의도와 스트림 _isatty () 의 적용 범위를 이해하면 잘못된 통화를 피하면 PHP 스크립트가 더욱 강력해질 수 있습니다.