如何检查bash输入是否正在重定向到PHP脚本?

时间:2017-04-07 14:05:42

标签: php bash stdin

我正在编写PHP脚本,我希望能够可选使用文件作为脚本输入。这样:

$ php script.php < file.txt

我实际上能够使用file_get_contents

来做到这一点
$data = file_get_contents('php://stdin');

但是,如果我没有将文件传递给输入,那么脚本会不确定地挂起,等待输入。

我尝试了以下操作,但它没有工作:

$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之前尝试读取输入,进行了另一次尝试。但那也没有用。

关于如何实现这一目标的任何想法?

1 个答案:

答案 0 :(得分: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

显然,您可以根据需要将一次一行fgets()的使用更改为fread()