Что я хочу, так это возможность по выбору труба STDIO в PHP-скрипт. Если нет, он будет принимать входные данные из файла. Поэтому иногда я просто запускаю скрипт, а иногда я делаю что-то вроде
grep text logfile | php parseLog.php
У меня очень похожий цикл, и он отлично работает, когда существует STDIO:
while (FALSE !== ($line = fgets(STDIN)))
{
$customLogArr[]=$line;
}
Когда нет STDIO, хотя он останавливает ожидание некоторых, он даже не входит в цикл.
То, что я хотел бы сделать, это быть в состоянии обнаружить если У меня есть вход STDIO или нет. Есть способ сделать это?
if(FALSE !== ftell(STDIN))
{
while (FALSE !== ($line = fgets(STDIN)))
{
$customLogArr[]=$line;
}
}
Для STDIN, если ничего не может быть прочитано, ftell()
вернет ложь.
Это то, что вы ищете? Простите, если я неправильно понял, это не должно вас удерживать, когда нет ввода в 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;
}
Похоже, что-то изменилось или ни один из этих ответов никогда не был правильным. Вы не можете просто 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
Вышеупомянутое решение не работает для меня. Это тот, который работает.
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 () кажется простым подходом.