I'm working on some PHP cli tools for a php framework and there's a situation where my script either reads from a file or STDIN. Since not all operations (like fseek()) are valid on STDIN, I'm looking for a way to detect this.
2 Answers
Turns out that the function stream_get_meta_data() provides a solution, when called on standard in, the result is:
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) } So you can do a simple string compare on the uri:
function isSTDIN($stream) { $meta = stream_get_meta_data($stream); return strcmp($meta['uri'], 'php://stdin') == 0; } This solution will work whether the constant stream STDIO is used, or the old fopen('php://stdin', 'r'), which still lurks around in old code.
Comments
Simply check if($fp === STDIN)
1 Comment
Dana the Sane
I thought of that, but I'm working with legacy code that uses the older
fopen('php://stdin.. syntax, making the comparison fail. This should work if use the constant instead.
stdinor a standard file to a particular function? Do you mean you don't know whetherstdincorresponds to a TTY or a file being piped in?stdincomes from a tty or a file regarding seeking abilities etc, I'm sure he doesn't want a PHP equivalent ofisatty(). I guess he has a function which accepts an fd and he wants to make his code generic so it can work with both a regular file and stdin.