2017-04-07 125 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 

很明显,你可以改变使用线在-A-时间fgets()到大块-AT-A-时间fread()按您的需求。

+1

正如我从OP所理解的那样,我认为这不是关于阻塞IO,而是关于检查输入是否isset,'然而,如果我没有将文件传递到输入,那么脚本会不确定地挂起,等待输入“。 – hassan

+0

正确 - 这项技术将缓解这个问题。如果在STDIN上没有可用的输入,该函数将立即返回一个空字符串。 –

+0

@AlexHowansky,它按我想要的方式工作。我不知道'stream_set_blocking'函数。 –