dongshou1856 2017-04-07 14:05
浏览 112
已采纳

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

I'm writing a PHP script and I would like to be able to optionally use a file as the script input. This way:

$ php script.php < file.txt

I'm, actually, able to do that using file_get_contents:

$data = file_get_contents('php://stdin');

However, if I don't pass a file to the input, the scripts hangs indefinetelly, waiting for an input.

I tried the following, but it didn't work:

$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));

The script waits for fread to return a value, but it never returns. I guess it waits for some input the same way file_get_contents does.

Another attempt was made by replacing the do { ... } while loop by a while { ... }, checking for the EOF before than trying to read the input. But that also didn't work.

Any ideas on how can I achieve that?

  • 写回答

1条回答 默认 最新

  • duanbicheng3345 2017-04-07 14:10
    关注

    You can set STDIN to be non-blocking via the stream_set_blocking() function.

    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
    

    Obviously, you can change the use of line-at-a-time fgets() to hunk-at-a-time fread() as per your needs.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 AT89C51控制8位八段数码管显示时钟。
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 下图接收小电路,谁知道原理
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题