2015-02-17 113 views
3

我想要的是能够可选 pipe STDIO到PHP脚本。如果不是,它会从文件取而代之。所以有时我会简单地运行该脚本,其他时间我会做这样的事情PHP - 检测STDIO输入

grep text logfile | php parseLog.php 

我有一个循环非常喜欢这一点,当STDIO存在,它工作得很好:

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

当有没有STDIO,虽然它暂停等待一些,它甚至不进入循环。

我想要做的就是能够检测如果我有STDIO输入与否。有没有办法做到这一点?

回答

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

对于STDIN,如果什么都不能读取,ftell()将返回false。

+0

我上次检查STDIN的位置在从STDIN读取时不会归零,它始终是一个非负整数,因此'ftell'总是返回'integer'。 – DeDee 2015-02-17 21:37:10

+0

@DeDee是的,你是对的。所以假只意味着当前进程没有STDIN。 – carysun 2015-02-17 21:45:31

+0

正确,直到STDIN关闭。 – DeDee 2015-02-17 21:47:24

2

这是你在找什么?如果我误解了,请原谅我,当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; 
} 
+0

即使在通知修复后,也不工作。 – AbraCadaver 2015-02-17 21:36:13

+0

奇怪它不适合你,我从我的OOP项目中提取它,它的工作方式与我描述的一样。 – DeDee 2015-02-17 21:38:18

+0

我reran,是的,但是:'fread()期待2个参数,1给出' – AbraCadaver 2015-02-17 21:38:56

-1

上述解决方案对我无效。这是可行的。

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

    var_dump($args); 

} else { 
    echo 'No input'; 
} 

注意:这将读取管道输送到脚本的字符串的数据:回声的“Hello World” | php test.php会输出字符串(12)“Hello World”(+在最后的新行......)所以如果需要的话,你需要进一步处理数据到一个数组。 explode()似乎是一个简单的方法。

+0

但是当没有一个STDIN时它会挂起。这是OP想要解决的问题。 – AbraCadaver 2015-02-17 21:44:45

+0

正确,不幸的是,当没有STDIN时,这不起作用。我希望。 :) – Arkandel 2015-02-17 22:22:30

+0

问题是试图先没有'ftell($ resource)'获取内容。如果你只知道你在做什么以及为什么,这个页面上的大部分代码都可以工作。 – MrMesees 2017-10-16 13:17:47

0

看起来有些事情已经改变,或者这些答案都没有正确。你不能简单地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