PHP缓冲区为什么\r\n

PHP缓冲区为什么\r\n,php,header,output-buffering,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&

在评论中,我有一些关于以下脚本的概念性问题(我认为都是相关的)。剧本写得很好

<?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\r\n
发送到浏览器?我想这与标题有关

第二,为什么我中间需要一些HTML?< /P> 第三,有许多示例使用256字节而不是4096字节。但是,如果我使用256,脚本将无法工作。这些例子是否过时了,这个数字将来还会改变吗

//编辑有关源链接的信息

此代码主要从和中收集。两者都没有提到为什么要包含
\r\n

//编辑有关标题的内容

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


此外,如果在
会话\u start()
之前调用此函数,则会抛出一个错误:“无法发送会话缓存限制器-头已发送”

使用
\r\n
的原因是,当使用Windows源代码查看器(如
notepad.exe
)查看时,会使输出呈现良好

这里与标题无关

由于代码使用了输出缓冲函数,我不知道为什么它们需要尝试溢出4kb缓冲区(标准
php.ini
中的默认值,但更多专业人士会选择不使用默认输出缓冲)

首先,为什么我需要将
\r\n\r\n
发送到浏览器?我想这与标题有关

第二,为什么我中间需要一些HTML?< /P> 通常情况下,浏览器必须等到获取了整个响应后才能呈现(只需想想在最后一个字符之前有效的XML)。但由于这会造成糟糕的用户体验,大多数浏览器会尽早开始解析和呈现内容

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

第三,有许多示例使用256字节而不是4096字节。但是,如果我使用256,脚本将无法工作。这些例子是否过时了,这个数字将来还会改变吗

由于手册提示web服务器中可能会包含一些进一步的缓冲区,这可能是为了使缓冲区溢出,这些缓冲区也会被刷新以达到预期效果。


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

了解脚本的用途/预期结果会有所帮助。4096字节是默认的
php.ini
输出缓冲设置<代码>\r\n只是一个典型的Windows环境新行。您从何处获得此代码?它应该做什么?+1这是一个有效的问题。如果答案不在您的能力范围内,请不要将其标记为无效it@cambraca谷歌福!我认为它试图在浏览器中溢出缓冲区,因为理论上flush()应该,嗯,刷新php缓冲区,不是吗?@cambraca在
flush()
manual页面中有很多提示-我在第一次编辑中链接到的SO问题的解决方案有一条注释,作者在其中指出“虽然我需要在刷新内容之前将\r\n与内容一起发送,以使其正常工作“。有没有关于如何在不出现4kb溢出问题的情况下处理此问题的建议?这也是有道理的。但是,如果我发送
\r\n sometext\r\n
,脚本将失败。它只在中间使用标签。纯文本不会仅仅通过一个文本节点触发DOM吗?@Steve:不,显然不会。虽然通常内容类型标题字段指定内容类型,但在某些情况下,该信息会丢失。因此,没有提示实际发送的是什么,并且在大多数浏览器中都会发生。请进一步解释您正在显示的内容。