好嘞,各位观众老爷们,今天咱们聊点啥呢?嗯… 没错!就是那个在命令行里让你的程序不再“黑白无常”,瞬间变得五彩斑斓,还能给你整出一个炫酷进度条,让你知道程序跑到哪儿了的——PHP命令行颜色输出与Progress Bar!
别一听“命令行”就觉得枯燥,其实这玩意儿玩好了,能让你的脚本逼格瞬间提升好几个档次。想象一下,你的程序在服务器上默默运行,突然弹出一行红色的警告,或者一个绿色的“OK”,是不是感觉瞬间亲切了很多?这可比干巴巴的文字输出强多了!
第一幕:颜色的诱惑:让命令行不再单调
首先,咱们来聊聊怎么给命令行穿上漂亮的衣服。要知道,默认情况下,命令行输出的文字都是黑白的,就像老照片一样,缺乏生机。但别担心,PHP可以帮你搞定这一切!
其实,命令行颜色输出的原理很简单,就是利用特殊的ANSI转义序列。这些序列是一些特殊的字符组合,告诉终端(比如你的终端模拟器、SSH客户端等等)改变后续文字的颜色或样式。
举个栗子:
33[30m
设置文字颜色为黑色33[31m
设置文字颜色为红色33[32m
设置文字颜色为绿色33[33m
设置文字颜色为黄色33[34m
设置文字颜色为蓝色33[35m
设置文字颜色为紫色33[36m
设置文字颜色为青色33[37m
设置文字颜色为白色33[0m
恢复默认颜色
这些代码就像魔法咒语一样,只要在你的字符串里加入它们,就能让文字变色。
<?php
echo "33[31m这是红色的文字33[0mn";
echo "33[32m这是绿色的文字33[0mn";
echo "33[33m警告!33[0mn"; // 警告通常用黄色
echo "33[34m信息:一切正常33[0mn"; // 信息通常用蓝色
?>
运行这段代码,你会看到命令行输出了不同颜色的文字。是不是很简单?
等等,还有背景色呢!
除了文字颜色,我们还可以设置背景色,让文字更加醒目。
33[40m
设置背景颜色为黑色33[41m
设置背景颜色为红色33[42m
设置背景颜色为绿色33[43m
设置背景颜色为黄色33[44m
设置背景颜色为蓝色33[45m
设置背景颜色为紫色33[46m
设置背景颜色为青色33[47m
设置背景颜色为白色
<?php
echo "33[41m33[37m红色背景白色文字33[0mn"; // 红色背景,白色文字
?>
这段代码会输出红色背景,白色文字。是不是有点警示牌的感觉了?
字体样式也别放过!
除了颜色,我们还可以改变文字的样式,比如加粗、下划线等等。
33[1m
加粗33[4m
下划线33[7m
反显(交换前景色和背景色)33[0m
恢复默认样式
<?php
echo "33[1m这是加粗的文字33[0mn";
echo "33[4m这是带有下划线的文字33[0mn";
echo "33[7m这是反显的文字33[0mn";
?>
封装一下,让代码更优雅
直接在字符串里写这些转义序列显得有点乱,我们可以把它们封装成函数,让代码更易读、易维护。
<?php
/**
* 给文字添加颜色和样式
*
* @param string $text 要添加颜色的文字
* @param string $color 文字颜色 (black, red, green, yellow, blue, purple, cyan, white)
* @param string $background 背景颜色 (black, red, green, yellow, blue, purple, cyan, white)
* @param array $options 样式选项 (bold, underline, reverse)
*
* @return string
*/
function colorize(string $text, string $color = null, string $background = null, array $options = []): string
{
$colors = [
'black' => '30',
'red' => '31',
'green' => '32',
'yellow' => '33',
'blue' => '34',
'purple' => '35',
'cyan' => '36',
'white' => '37',
];
$backgrounds = [
'black' => '40',
'red' => '41',
'green' => '42',
'yellow' => '43',
'blue' => '44',
'purple' => '45',
'cyan' => '46',
'white' => '47',
];
$options_code = [
'bold' => '1',
'underline' => '4',
'reverse' => '7',
];
$codes = [];
if ($color && isset($colors[$color])) {
$codes[] = $colors[$color];
}
if ($background && isset($backgrounds[$background])) {
$codes[] = $backgrounds[$background];
}
foreach ($options as $option) {
if (isset($options_code[$option])) {
$codes[] = $options_code[$option];
}
}
if (!empty($codes)) {
return "33[" . implode(';', $codes) . "m" . $text . "33[0m";
}
return $text;
}
// 使用示例
echo colorize("这是一段红色的文字", 'red') . "n";
echo colorize("这是一段绿色背景的文字", null, 'green') . "n";
echo colorize("这是一段加粗并下划线的蓝色文字", 'blue', null, ['bold', 'underline']) . "n";
?>
这个colorize
函数接受四个参数:
$text
: 要添加颜色和样式的文字$color
: 文字颜色,可选值:black
,red
,green
,yellow
,blue
,purple
,cyan
,white
$background
: 背景颜色,可选值同上$options
: 样式选项,可选值:bold
,underline
,reverse
使用起来是不是方便多了?
第二幕:进度条的艺术:让等待不再漫长
光有颜色还不够,咱们还要给程序加上一个进度条,让用户知道程序跑到哪儿了,而不是傻傻地等待。
进度条的原理也很简单,就是不断地更新同一行输出,模拟进度增加的效果。 这里需要用到一些特殊的控制字符。
r
回车符,将光标移动到行首,覆盖之前的输出33[K
清除从光标到行尾的内容
<?php
/**
* 显示进度条
*
* @param int $current 当前进度
* @param int $total 总进度
* @param int $width 进度条宽度
*/
function progressBar(int $current, int $total, int $width = 50): void
{
$percent = round(($current / $total) * 100);
$bar = str_repeat('=', floor($percent * $width / 100));
$empty = str_repeat(' ', $width - strlen($bar));
echo "r[{$bar}{$empty}] {$percent}%";
if ($current >= $total) {
echo "n"; // 完成后换行
}
}
// 模拟一个耗时操作
$total = 100;
for ($i = 0; $i <= $total; $i++) {
usleep(50000); // 模拟耗时操作
progressBar($i, $total);
}
?>
这段代码会输出一个简单的进度条,随着循环的进行,进度条会不断地增长,直到完成。
更高级的进度条:让信息更丰富
上面的进度条比较简单,只能显示百分比。我们可以让进度条显示更多信息,比如已完成的数量、剩余数量、预计剩余时间等等。
<?php
/**
* 显示更高级的进度条
*
* @param int $current 当前进度
* @param int $total 总进度
* @param string $message 显示的信息
* @param int $width 进度条宽度
*/
function advancedProgressBar(int $current, int $total, string $message = '', int $width = 50): void
{
$percent = round(($current / $total) * 100);
$bar = str_repeat('=', floor($percent * $width / 100));
$empty = str_repeat(' ', $width - strlen($bar));
$completed = $current;
$remaining = $total - $current;
echo "r[{$bar}{$empty}] {$percent}% ({$completed}/{$total}) Remaining: {$remaining} {$message}";
if ($current >= $total) {
echo "n"; // 完成后换行
}
}
// 模拟一个耗时操作
$total = 100;
for ($i = 0; $i <= $total; $i++) {
usleep(50000); // 模拟耗时操作
$message = "Processing item {$i}";
advancedProgressBar($i, $total, $message);
}
?>
这段代码在进度条上显示了已完成的数量、总数量和剩余数量,以及一个自定义的消息。
表格总结
为了方便大家理解,我把上面提到的颜色代码、样式代码和进度条相关代码整理成表格:
类别 | 代码 | 描述 |
---|---|---|
文字颜色 | 33[30m – 33[37m |
设置文字颜色,30-37分别对应黑到白 |
背景颜色 | 33[40m – 33[47m |
设置背景颜色,40-47分别对应黑到白 |
字体样式 | 33[1m |
加粗 |
33[4m |
下划线 | |
33[7m |
反显 | |
控制字符 | r |
回车符,光标移动到行首 |
33[K |
清除从光标到行尾的内容 |
第三幕:更上一层楼:使用第三方库
虽然我们可以自己实现颜色输出和进度条,但已经有很多优秀的第三方库帮我们做好了这些事情。 使用这些库可以让我们更专注于业务逻辑,而不用重复造轮子。
比如:
- Symfony Console Component: Symfony框架的控制台组件,提供了强大的命令行工具开发能力,包括颜色输出、进度条、输入输出处理等等。
- Hoa Console: Hoa项目的一个控制台组件,提供了丰富的功能,包括颜色输出、进度条、格式化输出等等。
- cli: 一个轻量级的PHP命令行工具库,提供了简单的颜色输出和进度条功能。
这些库通常提供了更高级的功能,比如自动检测终端是否支持颜色输出,自动调整进度条的宽度,等等。
结尾:让你的命令行程序更上一层楼
好了,今天的分享就到这里。希望这篇文章能帮助你更好地理解PHP命令行颜色输出和进度条的原理和使用方法。
记住,命令行程序也可以很酷炫! 🎨 💻
通过颜色和进度条,你可以让你的命令行程序更加友好、易用,提升用户体验。 赶快行动起来,让你的程序变得更加精彩吧! 👍