web-dev-qa-db-fra.com

Mettre à jour la sortie de ligne de commande, c'est-à-dire pour la progression

J'aimerais pouvoir montrer un indicateur de progression dans un simple script PHP sur la ligne de commande. Au lieu de voir

Progress: 0%
Progress: 1%
etc...

Je voudrais juste que le nombre change et remplace le numéro précédent, un peu comme git clone le fait par exemple Resolving deltas: 100% (8522/8522), done..

En cherchant cela, j'ai trouvé même réponse à la question en Perl , ce qui est parfait, mais je ne l'ai pas trouvé en PHP. C'est possible? Sinon, je vais recourir à C.

Merci

Mise à jour: Si quelqu'un est intéressé par la version C++, c'est ici .

56
Adam

Cela peut être fait en utilisant les séquences d'échappement ANSI - voir ici pour une liste.

En PHP, vous utiliserez "\033" lorsqu'il est indiqué ESC sur cette page.


Dans votre cas, vous pouvez utiliser quelque chose comme ceci:

echo "Progress :      ";  // 5 characters of padding at the end
for ($i=0 ; $i<=100 ; $i++) {
    echo "\033[5D";      // Move 5 characters backward
    echo str_pad($i, 3, ' ', STR_PAD_LEFT) . " %";    // Output is always 5 characters long
    sleep(1);           // wait for a while, so we see the animation
}


J'ai simplifié un peu, en m'assurant d'avoir toujours 5 caractères supplémentaires, et en affichant toujours la même quantité de données, pour toujours reculer du même nombre de caractères ...

Mais, bien sûr, vous devriez pouvoir faire beaucoup plus compliqué, si nécessaire ;-)

Et il existe de nombreuses autres séquences d'échappement intéressantes: les couleurs, par exemple, peuvent améliorer considérablement votre sortie ;-)

101
Pascal MARTIN

Pour mémoire, un vieux fil de discussion: au lieu d'utiliser un séquencement d'échappement ANSI sophistiqué pour déplacer le curseur vers l'arrière, je le ramène au début de la ligne en utilisant "\ r" au lieu du début de la ligne suivante "\ n" . Ajoutez quelques espaces après votre écho pour écraser tout ce qui s'y trouvait précédemment, comme par exemple donc:

for ($i=0 ; $i<=100 ; $i++) {
  echo "Progress: $i %   \r";
  sleep(1);
}
53
Dom