2015-02-17 41 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