2010-03-05 15 views
7

Ich habe ein PHP-Skript, das in CLI ausgeführt wird, und ich möchte den aktuellen Prozentfortschritt anzeigen, also fragte ich mich, ob es möglich ist, das STDOUT zu aktualisieren, um den neuen Prozentsatz anzuzeigen.Ich suche STDOUT in PHP

Wenn ich rewind() oder fseek() verwende, wird nur eine Fehlermeldung ausgegeben.

+0

Die folgenden Antworten sind ausgezeichnet, aber ich möchte einen alternativen Ansatz da draußen zu werfen: Halten Sie es einfach. Geben Sie regelmäßig eine neue Zeile mit Fortschrittsdaten aus. Oder drucken Sie ein "." verkohlen. Es ist nicht so cool wie die gleiche Zeile immer und immer wieder zu aktualisieren, aber es ist einfach, funktional, kompatibel und funktioniert genauso gut, ob die Ausgabe Ihrer App zu trimmen oder an eine Datei weitergeleitet wird. –

Antwort

7

Sehen Sie diesen Code:

<?php 
echo "1"; 
echo chr(8); 
echo "2"; 

Der Ausgang ist nur 2, da "chr (8)" das Zeichen für "Backspace" ist.

Drucken Sie einfach die Anzahl der Zeichen, die Sie zurückgehen müssen, und drucken Sie den neuen Prozentsatz.

Printing „\ r“ funktioniert auch unter Linux und Windows, aber ist es nicht geschnitten auf einem Mac gehen

Arbeitsbeispiel:

echo "Done: "; 
$string = ""; 
for($i = 0; $i < 100; ++$i) { 
    echo str_repeat(chr(8), strlen($string)); 
    $string = $i."%"; 
    echo $string; 
    sleep(1); 
} 
+0

Prost, diese Antwort war perfekt :) – instigator

+0

Es kann mit bestimmten 7/8 Bit Terminal-Emulationen arbeiten, aber es ist eine chaotische Lösung – symcbean

+1

Eine "chaotische" Lösung, die auf jedem Linux (Bash, Shell, ..) Windows und Mac-Plattform funktioniert und Es ist nicht erforderlich, dass Sie ncurses (ein zusätzliches PHP-Modul, das auf Ihrem Host möglicherweise nicht verfügbar ist) oder etwas anderes erstellen. Alles andere wäre eine Verschwendung von OP-Zeit in mindestens 95% der Anwendungsfälle. – edorian

4

Ausgabe \r und dann spülen, um zur ersten Spalte der aktuellen Zeile zurückzukehren.

+1

Alternativ könnten Sie versuchen, ncurses für Ihre Befehlszeilenausgabe zu verwenden, die über die Funktion ncurses_move (,) verfügt, mit der Sie die Ausgabe willkürlich beliebig positionieren können. – cazlab

-1

Das Schreiben auf eine Konsole/ein Terminal ist überraschend komplex, wenn Sie im Ausgabe-Raster zurückgehen oder Farben hinzufügen möchten - und das Verhalten hängt vom Typ der verwendeten Konsole/des Terminals ab. Vor langer Zeit hatten einige Leute die Idee, eine abstrakte Darstellung eines Terminals zu erstellen und darauf zu schreiben.

Weitere Informationen zur Vorgehensweise in PHP finden Sie unter this article.

+0

Er sagte bereits, dass er CLI verwendet. – cazlab

+1

@cazlab: "CLI" ist kein Terminal-Typ. –