Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何检查bash输入是否被重定向到PHP脚本?_Php_Bash_Stdin - Fatal编程技术网

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

如何检查bash输入是否被重定向到PHP脚本?,php,bash,stdin,Php,Bash,Stdin,我正在编写一个PHP脚本,我希望能够选择性地使用文件作为脚本输入。这样: $ php script.php < file.txt 但是,如果我没有将文件传递给输入,脚本将挂起,等待输入 我尝试了以下方法,但无效: $data = ''; $in = fopen('php://stdin', 'r'); do { $bytes = fread($in, 4096); // Maybe the input will be empty here?! But no, it's n

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

$ php script.php < file.txt
但是,如果我没有将文件传递给输入,脚本将挂起,等待输入

我尝试了以下方法,但无效:

$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\u get\u contents
等待输入的方式相同

另一种尝试是将
do{…}while
循环替换为
while{…}
,在尝试读取输入之前检查
EOF
。但这也不起作用


关于如何实现这一点有什么想法吗?

您可以通过
stream\u set\u 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()

正如我从OP中了解到的,我认为这不是关于阻止IO,而是关于检查输入是否已设置,'但是,如果我不将文件传递给输入,脚本将挂起,等待输入。对,这种技术可以缓解这个问题。如果STDIN上没有可用的输入,这个函数将立即返回一个空字符串。@AlexHowansky,它按照我想要的方式工作。我不知道
stream\u set\u blocking
函数。@justonUndermillion也许我对PHP客户端的要求太高了,但是还有其他非PHP命令行程序实现了这个逻辑-读取输入或忽略/退出。是的,你说得对。我走错了路@亚历克斯·霍万斯基明白了。
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