PHP-CLI-Progress-Bar
A PHP5 CLI Progress bar
Version 0.0.4, (*1)
Requirements
PHP >= 5.3, (*2)
How it works
There is one namespace ProgressBar that contains 2 classes Manager and Registry., (*3)
Manager is responsible to manage the progress bar. Each instance of this class is associated with a
Registry object. Each time the Manager needs to keep a metric, it is stored in this object., (*4)
When the display is requested, the script uses the string format and iterates over
all replacement rules. Replacements are handled by closures., (*5)
The progress bar has the following default output :
%current%/%max% [%bar%] %percent%% %eta%, (*6)
It is configurable. You can also change it while processing your batch script., (*7)
Buit-in variable replacement are :
* %current% : the current element
* %max% : the number of elements
* %bar% : the progress bar
* %percent% : the advancement in percent
* %eta% : estimation of the remaining, (*8)
Manager constructor arguments :
* current : the initial step
* max : the amount of steps in your process
* width : the max width of the line (default : 80)
* doneBarElementCharacter : a character to identify done advancement in the progress bar (default : =)
* remainingBarElementCharacter : a character to identify remaining advancement in the progress bar (default : -)
* currentPositionCharacter : a character to identify the current position in the progress bar (default : >), (*9)
How to use
Quick start
Add include statements at the beginning of your script (if you don't have autoloaders), (*10)
<?php
require_once 'ProgressBar/Manager.php';
require_once 'ProgressBar/Registry.php';
$progressBar = new \ProgressBar\Manager(0, 10);
for ($i = 0; $i <= 10; $i++)
{
$progressBar->update($i);
sleep(1);
}
Will output :, (*11)
1/10 [===>----------------------------------------------] 10.00% 00:00:09, (*12)
When you want to iterate over a collection, you don't event need to track the counter:, (*13)
foreach ($array as $element)
{
// process element
$progressBar->advance();
}
Configuration
Changing the output
Use the setFormat() method :, (*14)
$progressBar->setFormat('%current% |%bar%| %max%');
$progressBar->update(1);
Will output :, (*15)
1|>-------------------------------------------------------------------| 10, (*16)
Changing the max length
The max length is specified in the constructor :, (*17)
$pb = new \ProgressBar\Manager(0, 20, 120);
$progressBar->update(1);
Will output :, (*18)
1/20 [====>----------------------------------------------------------------------------------------] 5.00% 00:00:00, (*19)
Changing the progress bar style
Use the parameters specified in the constructor :, (*20)
$pb = new \ProgressBar\Manager(0, 20, 120, '-', ' ', ')');
$pb->update(5);
Will output :, (*21)
5/20 [-----------------------) ] 25.00% 00:00:00, (*22)
Extending
Adding custom replacement rules
You may add your custom variables for replacement. You have to use the method addReplacementRule and specify a priority, a tag and a closure.
Keep in mind that the length of the progress bar is evaluated at the end so that the output width will scale up to the width you specified.
So keeping the %bar% with a high priority is a good practice., (*23)
Here is an example of what you should do if you want to add a new replacement rule., (*24)
<?php
use ProgresBar;
$pb = new Manager(0, 213);
$pb->setFormat('Progress : %current%/%max% [%bar%] %foo%');
$pb->addReplacementRule('%foo%', 70, function ($buffer, $registry) {return 'OK!';});
$pb->update(1);
Will echo :, (*25)
Progress : 1/213 [>---------------------------------------------------] OK!, (*26)
ChangeLog
0.0.3 -> 0.0.4
- Changed RuntimeExceptions to InvalidArgumentExceptions
- Added advance() method for incrementing the progress bar
- Forbid to set the progress value greater than expected
0.0.2 -> 0.0.3
- Added composer support
- Added unit tests for the Manager and the registry
0.0.1 -> 0.0.2
- Changed directory structure to add namespace
- Changed priority behavior
- Added new public method addReplacementRule so that you don't need to extend the manager to add custom replacement rules
TODO
- ask developpers for feedback