如何确定流是否是PHP中的STDIN

时间:2011-04-06 20:11:23

标签: php command-line-interface

我正在为PHP框架开发一些PHP cli工具,我的脚本可以从文件或STDIN读取。由于并非所有操作(如fseek())在STDIN上都有效,我正在寻找一种方法来检测它。

2 个答案:

答案 0 :(得分:4)

事实证明函数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'),此解决方案都会有效。

答案 1 :(得分:1)

只需查看if($fp === STDIN)

即可