2017-04-07 5 views
2

나는 PHP 스크립트를 작성 중이므로 선택적으로 스크립트 입력으로 파일을 사용하고 싶습니다. 이 방법 :bash 입력이 PHP 스크립트로 리디렉션되는지 확인하는 방법은 무엇입니까?

$ php script.php < file.txt 

실제로, 해요, 수는 file_get_contents를 사용하는 것이해야 할 일 :

$data = file_get_contents('php://stdin'); 

을하지만, 내가 입력에 파일을 통과하지 않는 경우, 스크립트가, indefinetelly 응답 대기 입력 용.

나는 다음을 시도했지만 작동하지 않았다

$data = ''; 
$in = fopen('php://stdin', 'r'); 
do { 
    $bytes = fread($in, 4096); 
    // Maybe the input will be empty here?! But no, it's not :(
    if (empty($bytes)) { 
     break; 
    } 
    $data .= $bytes; 
} while (!feof($in)); 

스크립트가 값을 반환 할 fread을 기다립니다,하지만 반환하지 않습니다. 나는 그것이 같은 입력을 기다리는 것 같다. file_get_contents.

do { ... } while 루프를 while { ... }으로 바꾸고 입력을 읽으려고 시도하기 전에 EOF을 확인하려는 시도가있었습니다. 하지만 그것도 효과가 없었습니다.

어떻게 할 수 있습니까?

+0

@JustOnUnderMillions 아마 PHP 클라이언트에서 너무 많이 묻습니다.하지만이 로직을 구현하는 다른 ** 비 PHP ** 명령 줄 프로그램이 있습니다. 입력을 읽거나 무시합니다. –

+0

네가 맞다. 나는 틀린 차선에 있었다. @Alex Howansky는 그것을 가지고 있습니다. – JustOnUnderMillions

답변

3

stream_set_blocking() 함수를 통해 STDIN을 비 차단으로 설정할 수 있습니다.

function stdin() 
{ 
    $stdin = ''; 
    $fh = fopen('php://stdin', 'r'); 
    stream_set_blocking($fh, false); 
    while (($line = fgets($fh)) !== false) { 
     $stdin .= $line; 
    } 
    return $stdin; 
} 

$stdin = stdin(); // returns the contents of STDIN or empty string if nothing is ready 

물론, 당신은 왔던 남자 -에 - 한 - 시간 fread() 사용자의 필요에 따라 라인에서-A-시간 fgets()의 사용을 변경할 수 있습니다.

+1

OP에서 이해 한 것처럼 IO를 차단하는 것이 아니라 입력을 확인하는 것입니다. '그러나 입력에 파일을 전달하지 않으면 스크립트가 입력을 기다리고 무기한 정지 상태가됩니다. . ' – hassan

+0

오른쪽 -이 기술은 그 문제를 완화합니다. STDIN에서 사용할 수있는 입력이 없으면이 함수는 빈 문자열을 즉시 반환합니다. –

+0

@AlexHowansky, 그것은 내가 원하는 방식으로 작동했습니다. 나는'stream_set_blocking' 함수에 대해 몰랐다. –