PHP readline()当STDIN不是键盘时

时间:2012-02-28 17:00:10

标签: php stream redirect stdin 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和键盘读取?

感谢。

2 个答案:

答案 0 :(得分:6)

STDIN使用fgetc功能。见下文的例子。

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

控制台输出

样本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

答案 1 :(得分:3)

根据评论者的说法,PHP页面(http://php.net/manual/en/book.readline.php):

  

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

     

php somescript.php&lt; / dev / null |少

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

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