【问题标题】:PHP flush() / ob_flush() not working only with Android browserPHP flush() / ob_flush() 仅适用于 Android 浏览器
【发布时间】:2012-01-24 10:01:09
【问题描述】:

我发现了类似的问题,但没有一个比这个更具体。 以下代码是重现问题的简化版本。

<?php 
function addProgressText($texto)
{
  echo '<script type="text/javascript">'; 
  echo 'document.getElementById("mensajesEnProgreso").innerHTML += "'.$texto.'";';  
  echo '</script>';
  flush();
  ob_flush();
}

?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width" />
<title>TEST - Flush for Android</title>
</head>

<body>
  <div id="divEnProgreso">
    <p id="mensajesEnProgreso"></p>
  </div>

<?php
addProgressText("Init...");
sleep(5);
addProgressText("OK<br>Step 1... ");
sleep(5);
addProgressText("OK<br>Step 2... ");
sleep(5);
addProgressText("OK<br>Step 3... ");
sleep(5);
addProgressText("OK<br>FINISHED");
?>
</body>
</html>

代码在 Chrome、Firefox 和 IE 上按预期工作(一一显示步骤),但是当我从 Android 浏览器打开它时,刷新不起作用,完成后立即显示所有内容。

关于问题根源的任何提示? 谢谢

【问题讨论】:

  • 这不是 PHP 问题,浏览器可能有自己的缓冲,阻止它显示文本,直到它已经输出 X 个字符。
  • 我想说的是(就像@Truth 一样),PHP 在后端运行,与您的浏览器无关。那些sleep 的声明让我在一个完全不同的层面上担心。
  • @Jessedc 这可能是为了测试,但只是出于好奇,你为什么担心?
  • sleep 语句只是为了说明示例,它们只是替换了一些耗时的操作。有什么方法可以了解这个浏览器缓冲吗?
  • 通过添加 sleep 语句,您会延迟请求的完成,所以我并不感到惊讶 Android 浏览器会一直等到它获得所有页面,直到它开始读取内联放置的 javascript。

标签: php flush android-browser


【解决方案1】:

原因肯定是 Android 浏览器中的 4K 缓冲。 您唯一的选择是将输出填充为 4K,如this 错误报告中所述。

【讨论】:

  • 非常感谢@fab。我检查了您建议的错误报告,看起来它可能是问题的根源。至于解决方案,将每条消息填充到 4K 并不是很“小数据计划友好”,但我想不出别的办法,只能将推送模型更改为其他内容。
猜你喜欢
  • 2011-05-27
  • 2011-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多