2012-08-15 93 views
35

我想要做這樣的事情:讀線從STDIN

$ [mysql query that produces many lines] | php parse_STDIN.php 

parse_STDIN.php文件我希望能夠通過線從標準輸入解析我的數據線。

+0

您是否嘗試過從PHP腳本中調用該查詢?你知道mysqli_query(「SELECT'many_lines' FROM'big_table'」);?這樣,你不必傳遞任何參數或任何東西。 PHP是用於Web服務器的腳本語言。如果您想要真正的處理解決方案,請使用編程語言,如C. – ATaylor 2012-08-15 11:11:27

+0

首先:爲什麼?爲什麼不直接在PHP腳本中運行查詢?其次:'while(!feof(STDIN)){$ line = fgets(STDIN); do_stuff($線); }' – DaveRandom 2012-08-15 11:13:00

+0

您應該瞭解PHP手冊中的* Commandline Usage *部分:[Input/output streams](http://php.net/manual/features.commandline.io-streams.php) – hakre 2012-08-15 11:22:46

回答

69

使用STDIN常量作爲文件處理程序。

while($f = fgets(STDIN)){ 
    echo "line: $f"; 
} 

注意:STDIN上的fgets讀取\n字符。

+0

太棒了!那我想就更簡單了。謝謝 – sobi3ch 2012-08-15 14:31:15

+1

'接受'?你什麼意思。應該有[接受]按鈕還是什麼?對不起,我沒有經常使用stackoverflow,所以也許我錯過了一些東西。 – sobi3ch 2012-08-15 16:01:18

+0

好的我找到了,謝謝 – sobi3ch 2012-08-15 16:03:24

13

你也可以使用一個發生器 - 如果你不知道STDIN將會有多大。

需要PHP 5> = 5.5.0,PHP線沿線的7

東西:

function stdin_stream() 
{ 
    while ($line = fgets(STDIN)) { 
     yield $line; 
    } 
} 

foreach (stdin_stream() as $line) { 
    // do something with the contents coming in from STDIN 
} 

您可以在此處詳細瞭解發生器(或谷歌搜索教程): http://php.net/manual/en/language.generators.overview.php

+0

如果STDIN中的某行將爲空或「0」,該怎麼辦? – luchaninov 2016-09-27 11:30:36

+2

由於'fgets()'將換行符保留在最後(「\ n」),所以直到EOF纔會發生。 – MatsLindh 2017-07-26 13:48:36