task con progress bar

A volte può capitare di dover eseguire dei task che durano diversi minuti, per esempio per delle importazioni o per delle conversioni di grandi quantità di dati. In questi casi può essere molto utile avere nel terminale una barra di progressione, che indichi le quantità dei dati già lavorati e ancora da lavorare.
Questa piccola classe è stata scritta per sfruttare l’ottimo pacchetto Console_ ProgressBar di PEAR (non reinventare la ruota!)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
<?php
 
/**
 * progressbar task
 *
 * PEAR's Console_ProgressBar is required.
 * If Console_ProgressBar is not installed, no bar is displayed and no error is given
 * @see http://pear.php.net/package/Console_ProgressBar
 *
 * Usage: extend this class instead of sfBaseTask in your task.
 *        in your execute() method, call $this->init() and then other methods
 *        where appropriate.
 *
 * @author  Massimiliano Arione
 */
abstract class progressbarTask extends sfBaseTask
{
  protected
    $bar,
    $hasBar = false;
 
  /**
   * initialize ProgressBar
   */
  protected function init()
  {
    $this->hasBar = @include_once 'Console/ProgressBar.php';
  }
 
  /**
   * start bar
   * @param integer $count total number of items
   */
  protected function start($count = 0)
  {
    if ($this->hasBar)
    {
      $this->bar = new Console_ProgressBar('[%bar%] %percent% %elapsed%', '=>', ' ', 90, $count);
    }
  }
 
  /**
   * update the bar
   * @param integer $step
   */
  protected function update($step)
  {
    if ($this->hasBar)
    {
      $this->bar->update($step);
    }
  }
 
  /**
   * erase the bar
   */
  protected function erase()
  {
    if ($this->hasBar)
    {
      $this->bar->erase();
      $this->log('');
    }
  }
}

L’utilizzo è molto semplice: basta richiamare il metodo init(), quindi ogni volta che serve barra di progressione richiamare start(), update() ed erase() rispettivamente prima, durante e dopo il ciclo. Al metodo update() va passato un contatore, che deve essere incrementato nel ciclo stesso.

Pubblicato da Massimiliano Arione

web demiurge

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.

phpDay - Maggio 2019 a Verona