PHP缓冲区为什么\ r \ n

时间:2010-11-16 05:00:05

标签: php header output-buffering

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

<?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() functionthe solution to this SO question。两者都没有提及为什么要包含\r\n

//关于标题的编辑

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

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

3 个答案:

答案 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();
?>