命令行接口-如何确定一个流是否是PHP中的STDIN


command line interface - How to determine if a stream is STDIN in PHP

我正在为PHP框架开发一些PHP cli工具,并且存在我的脚本从文件或STDIN读取的情况。因为不是所有的操作(如fseek())都是有效的STDIN,我正在寻找一种方法来检测这一点。

结果是函数stream_get_meta_data()提供了一个解决方案,当在标准中调用时,结果是:

array(9) {
  ["wrapper_type"]=>
  string(3) "PHP"
  ["stream_type"]=>
  string(5) "STDIO"
  ["mode"]=>
  string(1) "r"
  ["unread_bytes"]=>
  int(0)
  ["seekable"]=>
  bool(false)
  ["uri"]=>
  string(11) "php://stdin"
  ["timed_out"]=>
  bool(false)
  ["blocked"]=>
  bool(true)
  ["eof"]=>
  bool(false)
}

你可以对uri做一个简单的字符串比较:

function isSTDIN($stream) {
    $meta = stream_get_meta_data($stream);
    return strcmp($meta['uri'], 'php://stdin') == 0;
}

这个解决方案将工作,无论使用恒定流STDIO,或旧的fopen('php://stdin', 'r'),它仍然潜伏在旧的代码。

查看if($fp === STDIN)