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.

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

报告相同问题?

悬赏问题

  • ¥15 乌班图ip地址配置及远程SSH
  • ¥15 怎么让点阵屏显示静态爱心,用keiluVision5写出让点阵屏显示静态爱心的代码,越快越好
  • ¥15 PSPICE制作一个加法器
  • ¥15 javaweb项目无法正常跳转
  • ¥15 VMBox虚拟机无法访问
  • ¥15 skd显示找不到头文件
  • ¥15 机器视觉中图片中长度与真实长度的关系
  • ¥15 fastreport table 怎么只让每页的最下面和最顶部有横线
  • ¥15 java 的protected权限 ,问题在注释里
  • ¥15 这个是哪里有问题啊?