原 荐 PHP 在 Console 模式下的

关于 \r\n 的由来

说到换行,大家都知道在在写程序时,提示语的结尾换行,在 Win\r\nMacLinux\n 表示,说到这里就要引用下阮一峰大神的一篇关于换行的文章: 回车和换行

在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33)的玩意,每秒钟可以打10个字符。但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符。要是在这0.2秒里面,又有新的字符传过来,那么这个字符将丢失。 于是,研制人员想了个办法解决这个问题,就是在每行后面加两个表示结束的字符。一个叫做"回车",告诉打字机把打印头定位在左边界;另一个叫做"换行",告诉打字机把纸向下移一行。

凑巧,前两天在知乎也看到了一个关于:为什么会用\r\n两个字符表示换行

[Line Feed]的作用是让打字机的卷轴向前卷一行,而[Return]的作用则是将打印头复位到行首,所以又叫[Cartridge Return(CR)]。

  • 想必到这里,大家应该明白了为什么用\r\n表示换行。

ASCII 码中的 \r\n

尽管在Win和Unix下换行的表示存在差异,但是在两大系统系列中,[Cartridge Return(CR)] 是一致的,均表示回到行首。

Console 下的进度

因为 \r (CR,回车) 表示将光标移到行首,\n (LF,换行) 表示将光标下移一行;所以,我们只将光标移到行首(CR,\r),不下移一行,就可以将原来此行内容重写。

那么,我们就可以在批量脚本的,单个循环的结束后更新整个脚本的进度,下面以一个文件块的下载为例:

则效果为:

这样,你就可以在自己的脚本中,很方便的实现进度展示了。

  • 其他语言也是类同的,你只需要在提示语的行位添加\r即可重写本行提示语
  • 有区别的是在不同的系统下,进度条的单位宽度不同,当出现换行,你可以拉宽下你的控制台(TTY)试试。

Symfony 下的 Console

Symfony 是一款优秀的PHP开源框架,其下的组件被广泛应用,其中 Console 组件更甚。

Symfony中,显示进度细节,使用 ProgressBar,传给它一个单元(unit)总数,然后在命令执行时,推进(advance)进度:

use Symfony\Component\Console\Helper\ProgressBar;
 
// create a new progress bar (50 units)
// 创建一个新的进度条(50单元)
$progress = new ProgressBar($output, 50);
 
// start and displays the progress bar
// 启动并显示进度条
$progress->start();
 
$i = 0;
while ($i++ < 50) {
    // ... do some work / 做一些事
 
    // advance the progress bar 1 unit
    // 推进进度条一个单位
    $progress->advance();
 
    // you can also advance the progress bar by more than 1 unit
    // 你也可以用一个以上的单位来推进进度条
    // $progress->advance(3);
}
 
// ensure that the progress bar is at 100%
// 确保进度条达到100%
$progress->finish();

并且支持多种自定义进度的样式(占位符)。

详细的文档:Progress Bar

中文的文档:Progress Bar(进度条)

相关链接

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序员的SOD蜜

使用Ring Buffer构建高性能的文件写入程序

最近常收到SOD框架的朋友报告的SOD的SQL日志功能报错:文件句柄丢失。经过分析得知,这些朋友使用SOD框架开发了访问量比较大的系统,由于忘记关闭SQL日志功...

53160
来自专栏小狼的世界

使用YUI3创建Popup弹出层

很多互联网的项目应用中,弹出层出现的越来越多,使用YUI3可以快速的实现制作弹出层的效果。

9510
来自专栏Django中文社区

Django模板标签regroup的妙用

在使用 Django 开发时,有时候我们需要在模板中按对象的某个属性分组显示一系列数据。例如博客文章按照时间归档分组显示文章列表(示例效果请看我的博客的归档页面...

34460
来自专栏北京马哥教育

python实现简单爬虫功能

iOS开发如果之前没接触过除了c和c++(c++太难了,不花个十来年基本不可能精通)的语言,第二门语言最好的选择就是Python.原因就是 1.语法简单 2.库...

34570
来自专栏用户2442861的专栏

Emmet for Dreamweaver:HTML/CSS代码快速编写神器

Emmet的前身是大名鼎鼎的Zen coding,如果你从事Web前端开发的话,对该插件一定不会陌生。它使用仿CSS选择器的语法来生成代码,大大提高了HTML...

25620
来自专栏为数不多的Android技巧

Android Studio你不知道的快捷键(二)

在Android Studio你不知道的快捷键(一)里面,主要讲述了一些窗口操作的快捷键还有补全参数提示等,这一篇会分享一些代码代码编辑的快捷键。(默认Keym...

12620
来自专栏Android知识点总结

Android基于TCP的五子棋双人对战实现

20620
来自专栏贺贺的前端工程师之路

ES6特性-Generators

你可以将Generators认为是可以中断进程、恢复进程的代码段,like this:

7520
来自专栏我的小碗汤

一个神秘现象引发对beego框架的思考

小强最近在项目中遇到了一个很奇怪的问题:在整改日志规范时,为了避免影响现有的代码结构以及改动尽可能小的前提下,在调用记日志的SDK处将某一个字段值首字母改为大写...

8840
来自专栏LanceToBigData

XML(一)XML大揭秘

前言 每天都要学习很多新的知识,比你厉害的程序员比你还努力,那你混的下这口饭吗?所以不抱怨,坚持!接下来给大家分享的是xml。可能很多做开发的都遇到过xml, ...

21290

扫码关注云+社区

领取腾讯云代金券