我正在为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)