进度条
编辑本页进度条
当执行长时间运行的命令时,显示进度信息可能会很有帮助,它会随着命令的运行而更新:
要显示进度详细信息,请使用ProgressBar,向它传递一个总单元数,并在命令执行时推进进度:
12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21
使用ob娱乐下载\组件\控制台\助手\ProgressBar;//创建一个新的进度条(50个单元)$progressBar=新ProgressBar ($输出,50);//启动并显示进度条$progressBar->开始();$我=0;而($我++ <50) {/ /……做一些工作//将进度条前进1个单位$progressBar->提前();//你也可以将进度条提前1个单位以上/ / progressBar - >进步(3);}//确保进度条在100%$progressBar->完成();
提示
你也可以返回进度条(即后退一步)通过调用进步- >提前()
带一个负值。例如,如果你打电话进步- >进步(2)
然后它将进度条后退2步。
而不是通过一些步骤(使用提前()方法),还可以通过调用setProgress ()方法。
提示
如果您的平台不支持ANSI代码,则进度条的更新将作为新行添加。要防止输出被淹没,请使用minSecondsBetweenRedraws ()方法来限制重绘制的数量setRedrawFrequency ()方法重新绘制每N次迭代。默认情况下,重绘频率为100毫秒或10%你的马克斯
.
如果您事先不知道确切的步数,请将其设置为合理的值,然后调用setMaxSteps ()
方法来根据需要更新它:
1 2 3 4 5
//以50个单元的进度条开始$progressBar=新ProgressBar ($输出,50);//一个复杂的任务被创建了:将进度条增加到200个单位$progressBar->setMaxSteps (200);
类时省略steps参数是另一种解决方案ProgressBar实例:
1
$progressBar=新ProgressBar ($输出);
然后进度将显示为一个悸动:
1 2 3 4 5 6 7 8 9
#没有马克斯步骤(显示像throbber) 0 [>---------------------------] 5 [----->----------------------] 5 [============================] # 马克斯步骤定义0/3 [>---------------------------] 0%的1/3 [=========>------------------] 33% 3/3 [============================] 100%
不管你什么时候完成任务,别忘了打电话完成()以确保进度条显示以100%的完成率刷新。
如果进度信息存储在可迭代变量(例如数组或PHP生成器)中,则可以使用迭代()方法,自动启动、前进和结束进度条:
12 3 4 5 6 7 8 9 10 11 12 13 14 15
使用ob娱乐下载\组件\控制台\助手\ProgressBar;$progressBar=新ProgressBar ($输出);// $iterable可以是array$可迭代的= (1,2];foreach($progressBar->迭代($可迭代的)作为$价值) {/ /……做一些工作}//或一个生成器函数可迭代的(){收益率1;收益率2;...};foreach($progressBar->迭代(iterable ())作为$价值) {/ /……做一些工作}
前面的代码将输出:
1 2 3
0/2 [>---------------------------] 0%的1/2 [==============>-------------] 50% 2/2 [============================] 100%
自定义进度条
内置的格式
类的当前详细程度决定了进度条上呈现的信息OutputInterface
实例:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
# OutputInterface: VERBOSITY_NORMAL 0/3 (CLI没有冗长的标志) [>---------------------------] 0%的1/3 [=========>------------------] 33% 3/3 [============================] 100% # OutputInterface:: VERBOSITY_VERBOSE 0/3 (- v) [>---------------------------] 0% 1秒的1/3 [=========>------------------] 33% 1秒3/3 [============================] 100% 1秒# OutputInterface:: VERBOSITY_VERY_VERBOSE 0/3 (vv) [>---------------------------] 1秒/ 1秒1/3的0% [=========>------------------] 33% 1秒/ 1秒3/3 [============================] 100% 1秒/ 1秒# OutputInterface: VERBOSITY_DEBUG 0/3 (-vvv) [>---------------------------] 0% 1秒/ 1秒1.0 MB的1/3 [=========>------------------] 1秒/ 1秒1.0 MB 3/3 33% [============================] 100% 1秒/ 1秒1.0 MB
请注意
如果调用带有quiet标志的命令(q
),进度条将不会显示。
与其依赖当前命令的详细模式,还可以强制使用via格式setFormat ()
:
1
$progressBar->setFormat (“详细”);
内置格式如下:
正常的
详细的
very_verbose
调试
如果未为进度条设置步骤数,请使用_nomax
变体:
normal_nomax
verbose_nomax
very_verbose_nomax
debug_nomax
自定义格式
除了使用内置格式,你还可以设置自己的格式:
1
$progressBar->setFormat (“%酒吧%”);
设置格式为只显示进度条本身:
1 2 3
>--------------------------- =========>------------------ ============================
进度条格式是包含特定占位符的字符串(名称用%
字符);占位符将根据进度条的当前进度进行替换。下面是内置占位符的列表:
当前的
:当前步长;马克斯
:最大步数(如果没有定义max,则为0);酒吧
:酒吧本身;百分比
:完成百分比(如果没有定义最大值,则不可用);运行
:进度条开始后经过的时间;剩下的
:完成任务的剩余时间(如果没有定义最大值则不可用);估计
:完成任务的估计时间(如果没有定义最大值则不可用);内存
:当前内存使用量;消息
:用于在进度条中显示任意消息(稍后解释)。
例如,下面是如何将格式设置为与调试
一:
1
$progressBar->setFormat (' %电流最大% / % %(%酒吧%)% %:3 s % % %时间:6 s % / %估计:6 s % %记忆:6 s %’);
注意到: 6
部分添加到一些占位符?这就是如何调整栏的外观(格式和对齐)。冒号后面的部分(:
)用于设置sprintf
字符串的格式。
除了为进度条的给定实例设置格式,你还可以定义全局格式:
1 2 3 4
ProgressBar::setFormatDefinition (“最低”,的进展:% % % %);$progressBar=新ProgressBar ($输出,3.);$progressBar->setFormat (“最低”);
这段代码定义了一个new最小的
格式,然后您可以使用您的进度条:
1 2 3
进度:0%进度:33%进度:100%
提示
重新定义内置格式几乎总是比创建新格式更好,因为这样可以根据命令的详细标志自动改变显示。
在定义包含仅在已知最大步数时可用的占位符的新样式时,您应该创建一个_nomax
变体:
1 2 3 4 5
ProgressBar::setFormatDefinition (“最低”,“剩下的% % % % % %”);ProgressBar::setFormatDefinition (“minimal_nomax”,% % % %的);$progressBar=新ProgressBar ($输出);$progressBar->setFormat (“最低”);
显示进度条时,格式将自动设置为minimal_nomax
如果该栏没有像上面的例子中那样的最大步数。
提示
格式可以包含任何有效的ANSI代码,也可以使用symfony特定的方式来设置颜色:ob娱乐下载
1 2 3 4
ProgressBar::setFormatDefinition (“最低”,' <信息> % % % > < /信息\ [32 m % 033 \ 033 [0 < fg =白色;bg =蓝色>剩下% % < / > ');
请注意
格式可以跨越多行;当您希望在进度条旁边显示更多上下文信息时,这是非常有用的(请参阅本文开头的示例)。
栏设置
在占位符中,酒吧
有点特殊,因为用于显示它的所有字符都可以自定义:
1 2 3 4 5 6 7 8 9 10 11
//酒吧完成的部分$progressBar->setBarCharacter (“<评论> = > < /评论”);//酒吧未完成的部分$progressBar->setEmptyBarCharacter (' ');//进度字符$progressBar->setProgressCharacter (“|”);//条宽度$progressBar->setBarWidth (50);
谨慎
出于性能考虑,Symfony每100毫秒重绘一次屏ob娱乐下载幕。如果这对您的应用程序来说太快或太慢,请使用这些方法minSecondsBetweenRedraws ()而且maxSecondsBetweenRedraws ():
12 3 4 5 6 7 8 9 10 11 12 13 14 15
$progressBar=新ProgressBar ($输出,50000);$progressBar->开始();//每100次重新绘制一次屏幕,但是设置了额外的限制://重绘速度不低于200ms(0.2)或超过100ms (0.1)$progressBar->setRedrawFrequency (One hundred.);$progressBar->maxSecondsBetweenRedraws (0.2);$progressBar->minSecondsBetweenRedraws (0.1);$我=0;而($我++ <50000) {/ /……做一些工作$progressBar->提前();}
自定义占位符
如果您希望显示一些依赖于进度条显示的信息,而这些信息在内置占位符列表中不可用,您可以创建自己的信息。让我们看看如何创建remaining_steps
显示剩余步骤数的占位符:
1 2 3 4 5 6
ProgressBar::setPlaceholderFormatterDefinition (“remaining_steps”,函数(ProgressBar$progressBar, OutputInterface$输出){返回$progressBar->getMaxSteps () -$progressBar->getProgress ();});
自定义消息
进度条定义了一个占位符消息
显示任意消息。然而,没有任何内置格式包括占位符,所以在显示这些消息之前,你必须定义自己的自定义格式:
1 2 3 4
ProgressBar::setFormatDefinition (“自定义”,' %当前%/%最大%——%消息%');$progressBar=新ProgressBar ($输出,One hundred.);$progressBar->setFormat (“自定义”);
现在,使用setMessage ()
属性的值%消息%
显示进度条前的占位符:
1 2 3 4 5 6 7 8
/ /……$progressBar->setMessage (“开始”);$progressBar->开始();// 0/100——启动$progressBar->setMessage (“任务正在进行中……”);$progressBar->提前();// 1/100——任务正在进行中…
消息也可以与自定义占位符组合。在本例中,进度条使用%消息%
而且%文件名%
占位符:
1 2 3 4
ProgressBar::setFormatDefinition (“自定义”,' %当前%/%最大%——%消息%(%文件名%)');$progressBar=新ProgressBar ($输出,One hundred.);$progressBar->setFormat (“自定义”);
的setMessage ()
方法接受第二个可选参数来设置自定义占位符的值:
1 2 3 4 5 6 7 8
/ /……// $files = ['client-001/invoices.xml', '…'];foreach($文件作为$文件名) {$progressBar->setMessage (“进口发票…”);$progressBar->setMessage ($文件名,“文件名”);$progressBar->提前();// 2/100——进口发票…(客户端- 001 / invoices.xml)}
显示多个进度条
当使用控制台输出部分可以同时显示多个进度条,并独立更改它们的进度:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
$section1=$输出->节();$section2=$输出->节();$progress1=新ProgressBar ($section1);$progress2=新ProgressBar ($section2);$progress1->开始(One hundred.);$progress2->开始(One hundred.);$我=0;而(+ +$我<One hundred.) {$progress1->提前();如果($我%2= = =0) {$progress2->推进(4);} usleep (50000);}
经过几次迭代后,终端中的输出将如下所示:
1 2
34/100 [=========>------------------] 34%的68/100 [===================>--------] 68%