在 PHP 中进行批处理操作时,通常会遇到需要在处理过程中给用户显示进度的需求。使用 time_nanosleep 函数可以实现高精度的睡眠控制,从而在批处理过程中模拟出进度条的更新效果。本文将介绍如何利用 time_nanosleep 结合简单的命令行进度条,实现带进度提示的批处理操作。
time_nanosleep 是 PHP 中用于暂停程序执行的函数,它允许程序暂停秒和纳秒级别的时间,格式如下:
bool time_nanosleep(int $seconds, int $nanoseconds);
$seconds:整数秒数
$nanoseconds:纳秒数,1秒=10亿纳秒
相较于 sleep 和 usleep,time_nanosleep 提供了更高精度的时间控制,适合需要细粒度等待的场景。
设定总处理步骤数,如 100。
每处理一部分任务后,更新进度条显示。
通过 time_nanosleep 来模拟每个步骤的处理时间,方便演示。
下面代码展示了如何用 time_nanosleep 来实现一个命令行进度条。
<?php
$totalSteps = 50; // 总步骤数
$barWidth = 40; // 进度条宽度
echo "开始批处理操作...\n";
for ($i = 1; $i <= $totalSteps; $i++) {
// 模拟任务处理时间,睡眠50毫秒
time_nanosleep(0, 50 * 1000000);
// 计算进度百分比
$progress = $i / $totalSteps;
$filledLength = round($barWidth * $progress);
// 构造进度条字符串
$bar = str_repeat("=", $filledLength) . str_repeat(" ", $barWidth - $filledLength);
// 输出进度条和百分比,使用 "\r" 回到行首,实现动态更新
printf("\r[%s] %.2f%%", $bar, $progress * 100);
flush();
}
echo "\n批处理操作完成!\n";
使用 time_nanosleep(0, 50 * 1000000) 使程序暂停 50 毫秒,模拟每步处理时间。
利用 \r 控制字符回到行首,实现进度条动态刷新。
printf 输出格式化的进度条和百分比。
flush() 确保输出及时显示。
如果批处理任务是真实操作,可将睡眠替换为具体任务执行逻辑。
结合输出日志或错误信息,更利于调试和监控。
可调整 $barWidth 和睡眠时间来控制进度条的显示效果和刷新速度。
更多关于 time_nanosleep 的官方文档可见:
https://gitbox.net/manual/en/function.time-nanosleep.php