Streams stream_select

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

stream_select — 초 및 마이크로초로 지정된 시간 제한을 사용하여 지정된 스트림 배열에서 select() 시스템 호출과 동일한 기능을 실행합니다.


설명

stream_select(
    ?array &$read,
    ?array &$write,
    ?array &$except,
    ?int $seconds,
    ?int $microseconds = null
): int|false
                

stream_select() 함수는 스트림 배열을 받아들이고 상태가 변경될 때까지 기다립니다. 그 동작은 스트림에 대해 동작한다는 점을 제외하고 socket_select() 함수의 동작과 동일합니다.


매개변수

read
read 배열에 나열된 스트림은 문자를 읽을 수 있는지 확인하기 위해 감시됩니다(더 정확하게는 읽기가 차단되지 않는지 확인하기 위해 - 특히 스트림 리소스는 파일 끝에서도 준비되어 있습니다. 이 경우 fread()는 길이가 0인 문자열을 반환합니다.
write
write 배열에 나열된 스트림은 쓰기가 차단되지 않는지 확인하기 위해 감시됩니다.
except
except 배열에 나열된 스트림은 우선 순위가 높은 예외("대역 외") 데이터가 도착하는지 감시합니다.

메모: stream_select()가 반환되면 read, writeexcept 배열이 수정되어 실제로 상태가 변경된 스트림 리소스를 나타냅니다. 어레이의 원래 키는 보존됩니다.

seconds
secondsmicroseconds는 함께 timeout 매개변수를 형성하며, seconds는 초 수를 지정하고 microseconds는 마이크로초 수를 지정합니다. timeoutstream_select()가 반환되기 전에 대기하는 시간의 상한선입니다. secondsmicroseconds가 모두 0으로 설정되면 stream_select()는 데이터를 기다리지 않고 대신 스트림의 현재 상태를 나타내는 즉시 반환됩니다.

secondsnull인 경우 stream_select()는 무기한 차단될 수 있으며, 감시된 스트림 중 하나에서 이벤트가 발생할 때(또는 신호가 시스템 호출을 중단하는 경우)에만 반환됩니다.

경고 시간 초과 값을 0으로 사용하면 스트림 상태를 즉시 폴링할 수 있지만 루프에서 시간 초과 값을 0으로 사용하면 스크립트가 CPU 시간을 너무 많이 소비하게 되므로 좋은 생각이 아닙니다.

다른 코드를 동시에 확인하고 실행해야 하는 경우 시간 초과 값을 최소 200000마이크로초로 사용하면 스크립트의 CPU 사용량을 줄이는 데 도움이 되지만 시간 초과 값을 몇 초로 지정하는 것이 훨씬 좋습니다.

시간 초과 값은 경과할 최대 시간임을 기억하십시오. stream_select()는 요청된 스트림을 사용할 준비가 되는 즉시 반환됩니다.

microseconds
seconds 설명을 참조하십시오.

반환 값

성공하면 stream_select()는 수정된 배열에 포함된 스트림 리소스의 수를 반환합니다. 흥미로운 일이 발생하기 전에 시간 초과가 만료되면 0이 될 수 있습니다. 오류가 발생하면 false가 반환되고 경고가 발생합니다(시스템 호출이 들어오는 신호에 의해 중단된 경우 발생할 수 있음).


변경 로그

버전 설명
8.1.0 microseconds는 이제 nullable입니다.

Examples

예제 #1 stream_select() 예

이 예에서는 $stream1 또는 $stream2에서 읽기 위해 데이터가 도착했는지 확인합니다. 시간 초과 값이 0이므로 즉시 반환됩니다.

                  
<?php
/* Prepare the read array */
$read   = array($stream1, $stream2);
$write  = NULL;
$except = NULL;
if (false === ($num_changed_streams = stream_select($read, $write, $except, 0))) {
    /* Error handling */
} elseif ($num_changed_streams > 0) {
    /* At least on one of the streams something interesting happened */
}
?>
                  
                

메모

메모:

현재 Zend 엔진의 한계로 인해 null과 같은 상수 수정자를 매개변수로 직접 전달하는 것은 불가능합니다. 대신 임시 변수 또는 가장 왼쪽 멤버가 임시 변수인 표현식을 사용하십시오.

                    
<?php
$e = NULL;
stream_select($r, $w, $e, 0);
?>
                    
                  
메모:

오류를 확인할 때 === 연산자를 사용해야 합니다. stream_select()는 0을 반환할 수 있으므로 ==와 비교하면 true로 평가됩니다.

                    
<?php
$e = NULL;
if (false === stream_select($r, $w, $e, 0)) {
    echo "stream_select() failed\n";
}
?>
                    
                  
메모:

배열에 반환된 스트림을 읽거나 쓰는 경우 요청한 데이터의 전체 양을 반드시 읽거나 쓸 필요는 없다는 점에 유의하십시오. 단일 바이트만 읽고 쓸 수 있도록 준비하십시오.

메모:

zlib와 같은 일부 스트림은 이 함수로 선택할 수 없습니다.

메모: 윈도우 호환성

proc_open()에 의해 반환된 파일 설명자에서 stream_select()를 사용하면 Windows에서 실패하고 false를 반환합니다.

콘솔의 STDIN은 입력 이벤트가 사용 가능한 즉시 상태를 변경하지만 스트림에서 읽기는 여전히 차단될 수 있습니다.


기타