Karp 的技术博客

2024-10-18T02:16:10.png
在命令行应用程序中,显示任务的进度条是一种常见的用户体验改进手段。本文将介绍如何在 PHP 中实现一个简单的进度条,并特别讲解 \r 在覆盖打印中的作用。

什么是 \r

\r 是一个控制字符,表示回车(Carriage Return)。在命令行中使用 \r 可以将光标移动到当前行的开头,而不换行。这使得我们能够在同一行上更新之前输出的内容,而不是每次都换行,从而实现覆盖打印的效果。

示例代码

以下是一个用 PHP 实现的进度条的完整示例:

<?php

function displayProgressBar($progress, $total)
{
    $barWidth = 50; // 进度条的宽度
    $progressPercentage = ($progress / $total);
    $barCount = (int) ($barWidth * $progressPercentage);
    $bar = str_repeat('=', $barCount) . str_repeat(' ', $barWidth - $barCount);
    
    // 使用 \r 进行覆盖打印,避免换行
    printf("\r[%s] %.2f%%", $bar, $progressPercentage * 100);
}

$total = 100; // 假设总任务数为 100

for ($i = 0; $i <= $total; $i++) {
    // 模拟任务执行时间
    usleep(50000); // 暂停 50 毫秒

    // 输出进度条
    displayProgressBar($i, $total);
}

echo "\n任务完成!\n";
?>

代码解析

  1. displayProgressBar 函数

    • 该函数接受当前进度和总进度作为参数。
    • barWidth 是进度条的总宽度,barCount 计算当前进度的比例。
    • 使用 str_repeat 方法构建进度条的视觉效果。
    • printf("\r[%s] %.2f%%", $bar, $progressPercentage * 100) 使用 \r 将光标移动到行首,从而实现覆盖打印。
  2. 主循环

    • for 循环模拟任务的进度。
    • usleep(50000) 用于暂停 50 毫秒,以模拟任务执行的时间。
  3. 输出

    • 进度条在命令行中实时更新,直到任务完成。最后输出一条“任务完成!”的消息。

输出示例

运行上述代码后,您将在命令行中看到类似下面的输出:

[==================================================] 100.00%
任务完成!

进度条会随着进度的增加而变化,直到填满。

结论

使用 \r 实现覆盖打印可以有效减少命令行界面的输出行数,使得进度条的显示更加清晰。同时,这种方式在执行长时间运行的任务时,能够为用户提供实时反馈。希望这篇博客能帮助你在 PHP 命令行应用中实现更好的用户体验!

php

版权属于:karp
作品采用:本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
更新于: 2024年10月21日 11:49
1

目录

来自 《在 PHP 命令行中实现进度条》
774 文章数
0 评论量
9 分类数
779 页面数
已在风雨中度过 9年277天3小时40分