PHP命令行颜色输出与Progress Bar

好嘞,各位观众老爷们,今天咱们聊点啥呢?嗯… 没错!就是那个在命令行里让你的程序不再“黑白无常”,瞬间变得五彩斑斓,还能给你整出一个炫酷进度条,让你知道程序跑到哪儿了的——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[30m33[37m 设置文字颜色,30-37分别对应黑到白
背景颜色 33[40m33[47m 设置背景颜色,40-47分别对应黑到白
字体样式 33[1m 加粗
33[4m 下划线
33[7m 反显
控制字符 r 回车符,光标移动到行首
33[K 清除从光标到行尾的内容

第三幕:更上一层楼:使用第三方库

虽然我们可以自己实现颜色输出和进度条,但已经有很多优秀的第三方库帮我们做好了这些事情。 使用这些库可以让我们更专注于业务逻辑,而不用重复造轮子。

比如:

  • Symfony Console Component: Symfony框架的控制台组件,提供了强大的命令行工具开发能力,包括颜色输出、进度条、输入输出处理等等。
  • Hoa Console: Hoa项目的一个控制台组件,提供了丰富的功能,包括颜色输出、进度条、格式化输出等等。
  • cli: 一个轻量级的PHP命令行工具库,提供了简单的颜色输出和进度条功能。

这些库通常提供了更高级的功能,比如自动检测终端是否支持颜色输出,自动调整进度条的宽度,等等。

结尾:让你的命令行程序更上一层楼

好了,今天的分享就到这里。希望这篇文章能帮助你更好地理解PHP命令行颜色输出和进度条的原理和使用方法。

记住,命令行程序也可以很酷炫! 🎨 💻

通过颜色和进度条,你可以让你的命令行程序更加友好、易用,提升用户体验。 赶快行动起来,让你的程序变得更加精彩吧! 👍

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注