3 votes

Symfony/Console : Comment utiliser plusieurs barres de progression ?

J'ai une commande pour Symfony/Console qui télécharge plusieurs fichiers à la fois en utilisant Buse Pool . J'ai déjà Guzzle qui rapporte le progrès en matière de téléchargement pour chaque fichier, cela fonctionne bien.

Maintenant, j'aimerais l'améliorer en utilisant la fonction Aide à la barre de progression Le problème est que tous les exemples que j'ai trouvés pour la ProgressBar n'utilisent qu'une seule barre de progression. J'ai besoin de plusieurs barres de progression indépendantes - une pour chacun des téléchargements. Pouvez-vous me donner un indice sur la façon d'y parvenir ?

8voto

Gander Points 166

J'ai trouvé quelque chose ici : [Console] Une meilleure barre de progression #10356

use Symfony\Component\Console\Helper\ProgressBar;
use Symfony\Component\Console\Output\ConsoleOutput;

$output = new ConsoleOutput();

$bar1 = new ProgressBar($output, 10);
$bar2 = new ProgressBar($output, 20);
$bar2->setProgressCharacter('#');
$bar1->start();
print "\n";
$bar2->start();

for ($i = 1; $i <= 20; $i++) {
    // up one line
    $output->write("\033[1A");
    usleep(100000);
    if ($i <= 10) {
        $bar1->advance();
    }
    print "\n";
    $bar2->advance();
}

Effet :

ProgressBar

Vous devez déplacer le curseur de la console sur la ligne appropriée (haut et bas) avant de mettre à jour la barre. Mais cela fonctionne. Je confirme.

2voto

Avec Symfony 4.1, ceci est supporté sans contrôle manuel du curseur, cf. https://symfony.com/doc/current/components/console/helpers/progressbar.html#console-multiple-progress-bars :

$section1 = $output->section();
$section2 = $output->section();

$progress1 = new ProgressBar($section1);
$progress2 = new ProgressBar($section2);

$progress1->start(100);
$progress2->start(100);

$i = 0;
while (++$i < 100) {
    $progress1->advance();

    if ($i % 2 === 0) {
         $progress2->advance(4);
    }

    usleep(50000);
}

0voto

Viktor Koval Points 9

Laravel 5.6 / linux

use Symfony\Component\Console\Helper\ProgressBar;
use Symfony\Component\Console\Output\ConsoleOutput;

$output = new ConsoleOutput();

$bar1 = new ProgressBar($output->section(), 10);
$bar2 = new ProgressBar($output->section(), 20);
$bar2->setProgressCharacter('#');
$bar1->start();
print "\n";
$bar2->start();

for ($i = 1; $i <= 20; $i++) {
    // up one line
    $output->write("\033[1A");
    usleep(100000);
    if ($i <= 10) {
        $bar1->advance();
    }
    print "\n";
    $bar2->advance();
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X