2010-03-05 9 views
7

Ho uno script php in esecuzione in CLI e voglio visualizzare l'avanzamento percentuale in corso, quindi mi chiedevo se è possibile aggiornare lo STDOUT per visualizzare la nuova percentuale.Ricerca di STDOUT in PHP

Quando si utilizza rewind() o fseek(), viene visualizzato solo un messaggio di errore.

+0

Le risposte di seguito sono eccellenti, ma mi piacerebbe lanciare un approccio alternativo là fuori: tienilo semplice. Pubblica periodicamente una nuova riga di dati sullo stato di avanzamento. O stampare un "." char. Non è bello aggiornare la stessa linea più e più volte, ma è semplice, funzionale, compatibile e funziona altrettanto bene se l'output della tua app sta per essere console o essere collegato a un file. –

risposta

7

Vedere questo codice:

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

L'uscita è solo 2 in quanto "chr (8)" è il char per "backspace".

Quindi basta stampare la quantità di caratteri di cui si ha bisogno per tornare indietro e stampare la nuova percentuale.

stampa "\ r" funziona anche su Linux e Windows, ma non ha intenzione di tagliare su un Mac

esempio di lavoro:

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

Cheers, questa risposta è stata perfetta :) – instigator

+0

Può funzionare con alcune emulazioni di terminale 7/8 bit ma è una soluzione disordinata – symcbean

+1

Una soluzione "disordinata" che funziona su ogni piattaforma Linux (bash, shell, ..) Windows e Mac e non richiede di costruire ncurses (un modulo php extra che potrebbe non essere disponibile sul tuo host) o qualcos'altro. Tutto più di questo sarebbe uno spreco di tempo di OP in almeno il 95% degli impieghi. – edorian

4

Uscita \r e quindi scorrere per tornare alla prima colonna della riga corrente.

+1

In alternativa puoi provare a usare ncurses per il tuo output sulla riga di comando che ha la funzione ncurses_move (,) che ti consente di mettere l'output dove vuoi, in modo arbitrario. – cazlab

-1

Scrivere su una console/terminale è sorprendentemente complesso se si desidera spostarsi all'indietro nel raster di output o fare cose come aggiungere colori - e il comportamento varierà a seconda del tipo di console/terminale che si sta utilizzando. Molto tempo fa alcune persone hanno avuto l'idea di costruire una rappresentazione astratta di un terminale e scrivere su quello.

Vedere this article per dettagli su come farlo in PHP.

+0

Ha già detto che stava usando la CLI. – cazlab

+1

@cazlab: "CLI" non è un tipo di terminale. –