php 默认会缓存全部输出,直到脚本执行完毕才一次性发送给浏览器,因此 `usleep()` 在本地环境(如 xampp)中无法实现逐字符显示效果;需配合 `ob_flush()` 和 `flush()` 手动清空输出缓冲,或更推荐使用前端 javascript 实现平滑动画。
在 PHP 中使用 usleep() 实现类似 RPG 对话框的逐字显示效果时,行为差异(如 Repl.it 正常而本地 XAMPP 全部延迟后一次性显示)的根本原因在于 输出缓冲机制 的不同配置。
Repl.it 等在线环境通常默认启用短缓冲或禁用缓冲,使得每次 echo 后能立即推送到浏览器;而本地 Apache + PHP(如 XAMPP)默认启用输出缓冲(output_buffering = 4096 或 On),且 Web 服务器(如 Apache)和浏览器自身也可能存在额外缓冲层,导致 usleep() 仅阻塞服务端执行,却无法让前端实时看到中间结果。
✅ 正确的服务端解决方案(需谨慎使用):
必须显式调用两级刷新函数——先清空 PHP 用户输出缓冲区(ob_flush()),再通知 Web 服务器将数据推送至客户端(flush()):
<?php
// 确保输出缓冲已启动(若未开启,可手动开启)
if (ob_get_level() === 0) {
ob_start();
}
$msg = "Once upon a time...";
for ($i = 0; $i < strlen($msg); $i++) {
echo '' . htmlspecialchars($msg[$i]) . '';
usleep(100000); // 100ms 延迟
ob_flush();
flush();
// 可选:兼容部分服务器,添加小量填充防止浏览器等待更多内容
if (connection_status() === CONNECTION_NORMAL) {
echo str_repeat(' ', 256);
ob_flush();
flush();
}
}
?>
⚠️ 注意事项: