3

在评论中,我有一些关于以下脚本的概念性问题(我认为都是相关的)。该脚本工作正常。

<?PHP
ob_start();

// Create string to overflow browser buffer ...?
$buffer = str_repeat(" ", 4096);

// Indicate new header / html content ...?
$buffer .= "\r\n<span></span>\r\n";

for ($i=0; $i<5; $i++) {
  echo $buffer.$i;
  ob_flush();
  flush();
  sleep(1);
}

ob_end_flush();
?>

首先,为什么我需要发送\r\n<tag>\r\n到浏览器?我认为它与标题有关。

其次,为什么中间需要一些HTML?

第三,有很多例子使用256字节而不是4096。但是,如果我使用256,脚本就不起作用。这些例子是否已经过时了,这个数字将来会再次改变吗?

//编辑源链接

这段代码主要是从php.netsleep()函数的注释和这个 SO question 的解决方案中收集的。都没有提到为什么要包含\r\n.

//编辑关于标题

如果我不添加\r\n、HTML 标记和第二组\r\n,脚本将无法在 Chrome 或 Safari 中正确执行(它只是一次转储所有值)。

此外,如果在 a 之前调用session_start()它,则会引发错误:“无法发送会话缓存限制器 - 标头已发送”。

4

3 回答 3

2

首先,为什么我需要发送\r\n<tag>\r\n到浏览器?我认为它与标题有关。

其次,为什么中间需要一些HTML?

通常浏览器必须等到他们获取了整个响应,直到它可以被渲染(想想在最后一个字符之前有效的 XML)。但由于这会带来糟糕的用户体验,因此大多数浏览器会尽早开始解析和呈现内容。

在这里,这个 HTML 片段可能是浏览器实际构建 DOM 并开始渲染的发起者。

第三,有很多例子使用256字节而不是4096。但是,如果我使用256,脚本就不起作用。这些例子是否已经过时了,这个数字将来会再次改变吗?

由于手册暗示 Web 服务器中可能包含一些进一步的缓冲,这可能是试图溢出那些它们也被刷新的缓冲区以达到预期的效果。

于 2010-11-16T06:44:36.043 回答
1

使用的原因\r\n是在使用 Windows 源查看器(如notepad.exe.

这里与标题无关。

看到代码使用输出缓冲功能,我不知道为什么他们觉得需要尝试溢出 4kb 缓冲区(标准中的默认值,php.ini尽管更多专业人士会选择不使用默认输出缓冲)。

于 2010-11-16T05:29:29.077 回答
-1
<?php

if (ob_get_level() == 0) ob_start();

for ($i = 0; $i<10; $i++){

        echo "<br> Line to show.";
        echo str_pad('',4096)."\n";    

        ob_flush();
        flush();
        sleep(2);
}

echo "Done.";

ob_end_flush();
?>
于 2014-06-30T19:32:57.040 回答