2011-05-05 88 views
14

可以使用unix管道將數據傳輸到命令行php腳本中嗎?我試過管道數據到命令行php?

$> data | php script.php 

但預期data並未露面。有沒有辦法做到這一點?

+0

看得那麼清楚:檢測一個PHP腳本正在運行交互式地或不是](http://stackoverflow.com/q/11327367/367456) – hakre 2015-11-06 11:05:59

回答

17

據我瞭解,會顯示程序的參數,換句話說:

php script.php arg1 arg2 arg3 

但是,如果你管數據到PHP,你將不得不從標準輸入讀取它。我從來沒有試過這個,但我認爲它是這樣的:

$fp = readfile("php://stdin"); 
// read $fp as if it were a file 
+2

如果你用「file」替換「readfile」,你會得到輸入爲一行數組,它不會自動回顯。 – 2015-06-23 14:01:26

4

你可以管數據,是的。但它不會出現在。它會去標準輸入。你可以閱讀這幾個方面,包括fopen('php://stdin','r')

有很好的例子in the manual

14

如果您data是一個喜歡,你還可以使用該-F或-R標誌(-F讀取&執行該文件下面呢,-R字面上執行它)如果你使用這些標誌已經在管道串會出現在(常規)全局變量$ ARGN

簡單的例子:

echo "hello world" | php -R 'echo str_replace("world","stackoverflow", $argn);' 
+0

這個工作,你不需要從標準輸入讀取。我認爲這應該被標記。 – Sebastian 2014-07-07 17:19:08

+0

請注意'-R一次**將讀取一行**,並執行每行的所有代碼。 – Qtax 2017-11-20 12:50:30

0

如果你想讓它在顯示,試試這個:

echo "Whatever you want" | xargs php script.php 

這將變相任何進入標準輸入命令行參數。

4

這爲我工作:

stream_get_contents(fopen("php://stdin", "r")); 
25

PHP可以從標準輸入讀取,並且還爲它提供了一個快捷方式:STDIN。

有了它,你可以做這樣的事情:

$data = stream_get_contents(STDIN); 

這將只轉儲所有的管道數據爲$的數據。

如果你要開始處理所有數據被讀取之前,或輸入尺寸太大,無法放入一個變量,你可以使用:

while(!feof(STDIN)){ 
    $line = fgets(STDIN); 
} 

STDIN只是$快捷FH = FOPEN (「php:// stdin」,「r」); 相同的方法可以應用於讀寫文件和tcp流。

3

在這篇文章中,我們看到一個腳本的行爲像一個shell腳本,爲每行輸入執行另一個命令...例如:

ls -ln | awk '{print $9}' 

如果你正在尋找做一個PHP腳本,以類似的方式表現,這爲我工作:

#!/usr/bin/php 
<?php 

$input = stream_get_contents(fopen("php://stdin", "r")); 

$lines = explode("\n", $input); 

foreach($lines as $line) { 
    $command = "php next_script.php '" . $line . "'"; 
    $output = shell_exec($command); 
    echo $output; 
}