2012-08-15 14 views
35

Ich möchte so etwas wie dies zu tun:Lese Zeile für Zeile von STDIN

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

In parse_STDIN.php Datei Ich möchte für Zeile von stdin meine Datenleitung in der Lage sein zu analysieren.

+0

Haben Sie versucht, diese Abfrage aus dem PHP-Skript heraus aufzurufen? Sie kennen mysqli_query ("SELECT' many_lines' FROM 'big_table'") ;? Auf diese Weise müssen Sie keine Argumente oder irgendetwas weiterleiten. PHP ist eine Skriptsprache, die für Webserver verwendet wird. Wenn Sie eine echte Verarbeitungslösung wünschen, verwenden Sie eine Programmiersprache wie C. – ATaylor

+0

Erstens: Warum? Warum nicht einfach die Abfrage im PHP-Skript ausführen? Zweitens: 'while (! Feof (STDIN)) {$ line = fgets (STDIN); do_stuff ($ -Zeile); } ' – DaveRandom

+0

Sie sollten wissen über die * Commandline Usage * Abschnitt im PHP-Handbuch: [Eingabe/Ausgabe-Streams] (http://php.net/manual/features.commandline.io-streams.php) – hakre

Antwort

69

Verwenden Sie STDIN Konstante als Dateihandler.

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

Hinweis: fgets auf STDIN liest den \n Charakter.

+0

Großartig! das ist einfacher als ich dachte. Danke – sobi3ch

+1

'Akzeptieren'? Was meinen Sie. Gibt es einen [accept] Button oder was? Sorry, ich verwende stackoverflow nicht oft genug, damit ich etwas verpasse. – sobi3ch

+0

ok Ich habe es gefunden, danke – sobi3ch

13

Sie könnten auch einen Generator verwenden - wenn Sie nicht wissen, wie groß der STDIN sein wird.

Benötigt PHP 5> = 5.5.0, PHP 7

Etwas entlang der Linien von:

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

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

Sie können hier mehr über Generatoren lesen (oder eine Google-Suche nach Tutorials): http://php.net/manual/en/language.generators.overview.php

+0

Was passiert, wenn eine Zeile in STDIN leer ist oder" "0"? – luchaninov

+2

Da 'fgets()' den Zeilenumbruch am Ende behält ("\ n"), wird das nicht vor EOF passieren. – MatsLindh