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