在评论中,我有一些关于以下脚本的概念性问题(我认为都是相关的)。该脚本运行正常。
<?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,则脚本不起作用。这些示例是否已过时,将来这个数字会再次改变吗?
//关于源链接的编辑
此代码主要来自commentary in php.net sleep()
function和the solution to this SO question。两者都没有提及为什么要包含\r\n
。
//关于标题的编辑
如果我不添加\r\n
,HTML标记和第二组\r\n
,则该脚本将无法在Chrome或Safari中正确执行(它只会立即转储所有值) 。
此外,如果在session_start()
之前调用此方法,则会抛出错误:“无法发送会话缓存限制器 - 已发送的标头”。
答案 0 :(得分:2)
首先,为什么我需要将
\r\n<tag>\r\n
发送到浏览器?我认为它与标题有关。其次,为什么我中间需要一些HTML?
通常情况下,浏览器必须等到它们已经获取整个响应,直到它可以呈现(只考虑在最后一个字符之前有效的XML)。但由于这会产生糟糕的用户体验,因此大多数浏览器都会尽早解析并呈现内容。
这里的HTML片段可以成为浏览器实际构建DOM并开始渲染的发起者。
第三,有许多例子使用256个字节而不是4096.但是,如果我使用256,则脚本不起作用。这些示例是否已过时,将来这个数字会再次改变吗?
由于手册暗示Web服务器中可能存在一些进一步的缓冲,这可能是尝试溢出那些也被刷新的缓冲区以获得预期的效果。
答案 1 :(得分:1)
使用\r\n
的原因是,使用像notepad.exe
这样的Windows源查看器查看输出时,可以很好地呈现输出。
这里与标题无关。
看到代码使用输出缓冲功能,我不知道他们为什么觉得需要尝试溢出4kb缓冲区(标准php.ini
中的默认值),尽管更多专业人员会选择不使用默认输出缓冲)。
答案 2 :(得分:-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();
?>