代码之家  ›  专栏  ›  技术社区  ›  Ben

PHP缓冲区原因\r\n

  •  3
  • Ben  · 技术社区  · 14 年前

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

    <?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 .

    //编辑相关标题

    如果我不加 \rn ,一个HTML标记和第二组 \rn ,脚本将无法在chrome或safari中正确执行(它只是一次性转储所有值)。

    此外,如果在 session_start() 它抛出一个错误:“无法发送会话缓存限制器-头已发送”。

    3 回复  |  直到 14 年前
        1
  •  2
  •   Gumbo    14 年前

    首先,我为什么要发送 \r\n<tag>\r\n 到浏览器?我想这和报头有关。

    第二,为什么我需要中间有一些HTML?

    通常,浏览器必须等到它们获取了整个响应之后才能呈现它(只需考虑在最后一个字符之前有效的XML)。但由于这会造成糟糕的用户体验,大多数浏览器都会尽早开始解析和呈现内容。

    在这里,这个HTML片段可以作为浏览器实际构建DOM并开始渲染的发起程序。

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

    正如手册所暗示的,Web服务器中可能还包含了一些缓冲区,这可能是为了达到预期的效果而试图溢出那些缓冲区。

        2
  •  1
  •   Phil    14 年前

    使用原因 \r\n 将使输出在使用类似Windows源代码查看器查看时呈现良好 notepad.exe .

    这里与标题无关。

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

        3
  •  -1
  •   LarsTech    10 年前
    <?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();
    ?>