当STDIN不是键盘时,PHP readline()



我正在编写一个脚本,该脚本可以从stdin读取,然后请求确认。

<?php
$stream = fopen('php://stdin', 'r');
$input = fgets($stream, 1024);
$confirmation = readline('Are you sure?');
if ( $confirmation == 'y' )
    /* Do dangerous stuff */

当我直接运行它时:

$ php script.php
inputdata
^D
Are you sure?

但我正在尝试使用一个名为STDIN的文件来运行它。在这种情况下,readline()返回false,并且不会提示确认。

$ php script.php < data.txt

$ echo "foobar" | php script.php

以这种方式调用这个脚本时,我如何从STDIN和键盘上读取?

谢谢。

将fgetc函数与STDIN一起使用。参见下面的示例。

$input = fgets(STDIN, 1024);
echo "nAre you sure?n";
$conf = fgetc(STDIN);
if($conf=='y'){
        echo "Great! Lets go aheadn";
}else{
        echo "Okay, May be next timen";
}

控制台输出

样品1

    $ echo 'data
    > y
    > ' | php php_readline.php
    Are you sure? 
    Great! Lets go ahead

样品2

$ php php_readline.php 
Some data
Are you sure?
n
Okay, May be next time

根据PHP页面上的一位评论(http://php.net/manual/en/book.readline.php):

启用readline后,php将终端模式切换为accept行缓冲输入。这意味着使用cli的正确方式当管道连接到交互式命令时,要显式指定php没有使用终端进行输入:

php somescript.php<dev/null|less

我认为重点是附加| less。由于不知道数据的结构,可能需要在脚本中做一些事情来处理从数据到确认的转换。

可以添加一种机制来检测何时启用终端线路缓冲输入。

相关内容

  • 没有找到相关文章

最新更新