Как определить, является ли поток STDIN в PHP - PullRequest
0 голосов
/ 07 апреля 2011

Я работаю над некоторыми инструментами PHP cli для фреймворка php, и есть ситуация, когда мой скрипт либо читает из файла, либо STDIN. Поскольку не все операции (например, fseek()) действительны на STDIN, я ищу способ обнаружить это.

Ответы [ 2 ]

4 голосов
/ 07 апреля 2011

Оказывается, что функция 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 голос
/ 07 апреля 2011

Просто проверьте if($fp === STDIN)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...