如何检查 bash 输入是否被重定向到 PHP 脚本?
How to check if bash input is being redirect to PHP script?
我正在编写一个 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
到 return 一个值,但它永远不会 return。我想它等待输入的方式与 file_get_contents
相同。
另一种尝试是用 while { ... }
替换 do { ... } while
循环,在尝试读取输入之前检查 EOF
。但这也没有用。
关于如何实现该目标的任何想法?
您可以通过 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()
。
我正在编写一个 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
到 return 一个值,但它永远不会 return。我想它等待输入的方式与 file_get_contents
相同。
另一种尝试是用 while { ... }
替换 do { ... } while
循环,在尝试读取输入之前检查 EOF
。但这也没有用。
关于如何实现该目标的任何想法?
您可以通过 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()
。