обнаружить вход STDIO

Что я хочу, так это возможность по выбору труба STDIO в PHP-скрипт. Если нет, он будет принимать входные данные из файла. Поэтому иногда я просто запускаю скрипт, а иногда я делаю что-то вроде

grep text logfile | php parseLog.php

У меня очень похожий цикл, и он отлично работает, когда существует STDIO:

while (FALSE !== ($line = fgets(STDIN)))
{
$customLogArr[]=$line;
}

Когда нет STDIO, хотя он останавливает ожидание некоторых, он даже не входит в цикл.

То, что я хотел бы сделать, это быть в состоянии обнаружить если У меня есть вход STDIO или нет. Есть способ сделать это?

4

Решение

if(FALSE !== ftell(STDIN))
{
while (FALSE !== ($line = fgets(STDIN)))
{
$customLogArr[]=$line;
}
}

Для STDIN, если ничего не может быть прочитано, ftell() вернет ложь.

0

Другие решения

Это то, что вы ищете? Простите, если я неправильно понял, это не должно вас удерживать, когда нет ввода в STDIN.

stream_set_blocking(STDIN, 1);

function CheckSTDIN() {
$read = array(STDIN);
$wrte = NULL;
$expt = NULL;
$a = stream_select($read, $wrte, $expt, 0);
if ($a && in_array(STDIN, $read)) {
// you can read from STDIN now, it'll only be available if there is anything in STDIN
// you can return the value or pass it to global or class variable
return fread(STDIN, 255); // set your desired string length
} else return false;
}

while (FALSE !== ($line = CheckSTDIN())) {
$customLogArr[]=$line;
}
2

Похоже, что-то изменилось или ни один из этих ответов никогда не был правильным. Вы не можете просто ftell(STDIN) чтобы увидеть, есть ли данные, переданные из STDIN

<?php

$stdin = fopen('php://stdin', 'r');
var_dump(ftell($stdin));

выходы

-:4:
bool(false)

Это из php -v с выходом

PHP 7.0.22-0ubuntu0.16.04.1 (cli) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
with Zend OPcache v7.0.22-0ubuntu0.16.04.1, Copyright (c) 1999-2017, by Zend Technologies
with Xdebug v2.4.0, Copyright (c) 2002-2016, by Derick Rethans

когда я пытаюсь использовать постоянную STDIN я получаю

PHP Notice:  Use of undefined constant STDIN - assumed 'STDIN' in - on line 3
0

Вышеупомянутое решение не работает для меня. Это тот, который работает.

if ($args = stream_get_contents(fopen("php://stdin", "r"))) {

var_dump($args);

} else {
echo 'No input';
}

Примечание. При этом данные будут переданы в сценарий в виде строки: echo «Hello World» | php test.php выведет строку (12) «Hello World» (+ новая строка в конце …), поэтому вам нужно дополнительно обработать данные в массив, если это требуется. explode () кажется простым подходом.

-1
По вопросам рекламы [email protected]