php实现进度条
PHP 实现进度条的方法
使用 HTML 和 CSS 结合 PHP 实现进度条
在 PHP 中,进度条通常通过 HTML 和 CSS 实现,PHP 负责计算进度并更新前端显示。

<div style="width: 100%; background-color: #ddd;">
<div id="progressBar" style="width: 0%; height: 30px; background-color: #4CAF50; text-align: center; line-height: 30px; color: white;"></div>
</div>
<?php
// 模拟进度更新
for ($i = 0; $i <= 100; $i++) {
echo "<script>document.getElementById('progressBar').style.width = '$i%'; document.getElementById('progressBar').innerHTML = '$i%';</script>";
ob_flush();
flush();
usleep(100000); // 延迟 0.1 秒
}
?>
使用 AJAX 实现动态进度条
对于长时间运行的任务,可以通过 AJAX 动态获取进度并更新进度条。

<div style="width: 100%; background-color: #ddd;">
<div id="progressBar" style="width: 0%; height: 30px; background-color: #4CAF50; text-align: center; line-height: 30px; color: white;"></div>
</div>
<button onclick="startProcess()">开始任务</button>
<script>
function startProcess() {
var xhr = new XMLHttpRequest();
xhr.open("GET", "process.php", true);
xhr.onreadystatechange = function() {
if (xhr.readyState == 4 && xhr.status == 200) {
var progress = xhr.responseText;
document.getElementById("progressBar").style.width = progress + "%";
document.getElementById("progressBar").innerHTML = progress + "%";
}
};
xhr.send();
}
</script>
<?php
// process.php
$progress = 0;
while ($progress <= 100) {
echo $progress;
ob_flush();
flush();
$progress += 10;
sleep(1);
}
?>
使用命令行实现进度条
在命令行环境中,可以使用 PHP 输出进度条。
<?php
function progressBar($done, $total, $size=30) {
static $start_time;
if ($done > $total) return;
if (empty($start_time)) $start_time = time();
$now = time();
$perc = (double)($done / $total);
$bar = floor($perc * $size);
$status_bar = "\r[";
$status_bar .= str_repeat("=", $bar);
if ($bar < $size) {
$status_bar .= ">";
$status_bar .= str_repeat(" ", $size - $bar);
} else {
$status_bar .= "=";
}
$status_bar .= "]";
$disp = number_format($perc * 100, 0);
$status_bar .= " $disp% $done/$total";
$rate = ($now - $start_time) / $done;
$left = $total - $done;
$eta = round($rate * $left, 2);
$status_bar .= " 剩余: " . number_format($eta) . "秒";
echo "$status_bar ";
flush();
if ($done == $total) {
echo "\n";
}
}
for ($i = 1; $i <= 100; $i++) {
progressBar($i, 100);
usleep(100000);
}
?>
使用第三方库实现进度条
可以使用第三方库如 symfony/console 来实现更复杂的进度条功能。
<?php
require_once __DIR__.'/vendor/autoload.php';
use Symfony\Component\Console\Helper\ProgressBar;
use Symfony\Component\Console\Output\ConsoleOutput;
$output = new ConsoleOutput();
$progress = new ProgressBar($output, 100);
$progress->start();
for ($i = 0; $i < 100; $i++) {
usleep(100000);
$progress->advance();
}
$progress->finish();
?>
注意事项
- 在 Web 环境中,确保服务器支持输出缓冲(
ob_flush()和flush())。 - 在命令行环境中,进度条需要实时输出,避免缓冲。
- 对于长时间运行的任务,建议使用 AJAX 或 WebSocket 实现实时更新。






