什么';php中ob_start()的用法是什么?

什么';php中ob_start()的用法是什么?,php,output-buffering,Php,Output Buffering,ob_start()是否用于输出缓冲,以缓冲标题而不发送到浏览器?我说得通吗?如果不是,那么我们为什么要使用ob_start()?此函数不仅仅用于标题。你可以用这个做很多有趣的事情。示例:您可以将页面拆分为多个部分,并按如下方式使用: $someTemplate->selectSection('header'); echo 'This is the header.'; $someTemplate->selectSection('content'); echo 'This is so

ob_start()
是否用于
输出缓冲
,以缓冲标题而不发送到浏览器?我说得通吗?如果不是,那么我们为什么要使用
ob_start()

此函数不仅仅用于标题。你可以用这个做很多有趣的事情。示例:您可以将页面拆分为多个部分,并按如下方式使用:

$someTemplate->selectSection('header');
echo 'This is the header.';

$someTemplate->selectSection('content');
echo 'This is some content.';

您可以捕获此处生成的输出,并将其添加到布局中两个完全不同的位置。

您可以将其向后添加。ob_start不缓冲标题,而是缓冲内容。使用
ob_start
可以将内容保存在服务器端缓冲区中,直到您准备好显示它为止


这通常用于在页面已经“发送”某些内容(即,在呈现页面的中途决定重定向)之后发送标题。

不,您错了,但方向合适;)

输出缓冲区缓冲脚本的输出。这(简而言之)是
echo
print
之后的所有内容。标题的问题是,它们只有在尚未发送的情况下才能被发送。但是HTTP说,头是传输的第一步。因此,如果您第一次(在请求中)输出某些内容,则会发送标头,并且您无法设置任何其他标头。

可以将
ob_start()
想象为“开始记住通常输出的所有内容,但现在还不完全使用它。”

例如:

ob_start();
echo("Hello there!"); //would normally get printed to the screen/output to browser
$output = ob_get_contents();
ob_end_clean();

还有两个其他的函数可以与之配对:
ob\u get\u contents()
,它基本上为您提供自使用
ob\u start()
打开以来“保存”到缓冲区的内容,然后是
ob\u end\u clean()
ob\u flush()
,这两个函数要么停止保存内容,要么丢弃保存的内容,或者停止保存并一次输出所有内容。

我使用它,这样我就可以使用大量HTML突破PHP,但不渲染它。它避免了我将其存储为禁用IDE颜色编码的字符串

<?php
ob_start();
?>
<div>
    <span>text</span>
    <a href="#">link</a>
</div>
<?php
$content = ob_get_clean();
?>

文本
而不是:

<?php
$content = '<div>
    <span>text</span>
    <a href="#">link</a>
</div>';
?>

这是为了进一步澄清

您经常遇到的问题是,您正在使用php从许多不同的php源输出html,而这些源通常(无论出于何种原因)通过不同的方式输出

有时,您需要将文字html内容直接输出到浏览器;其他时间动态创建输出(服务器端)

动态内容总是(?)将是一个字符串。现在,您必须将这个字符串化的动态html与任何文本相结合,直接显示html。。。转换为一个有意义的html节点结构

这通常迫使开发人员将所有直接显示内容的内容包装成一个字符串(正如JD Isaak所讨论的),以便它可以与动态html一起正确地交付/插入。。。即使你真的不想把它包起来

但是通过使用ob####方法,可以避免字符串包装混乱。而是将文本内容输出到缓冲区。然后在一个简单的步骤中,将缓冲区的全部内容(所有文本html)连接到动态html字符串中

(我的示例显示文本html被输出到缓冲区,然后将其添加到html字符串中……另请看JD Isaaks示例以查看html的字符串包装)




02-成分含量

此处接受的答案描述了
ob_start()
的功能,而不是使用它的原因(这是所问的问题)

如别处所述,
ob_start()
创建一个缓冲区,输出将写入该缓冲区

但是没有人提到在PHP中堆叠多个缓冲区是可能的。见()

至于为什么

  • 将HTML以较大的块发送到浏览器可以减少网络开销,从而提高性能

  • 通过减少所需的上下文切换数量,将数据以较大的块形式从PHP中传递出去,可以提高性能和容量

  • 将较大的数据块传递给mod_gzip/mod_deflate可以提高压缩效率,从而提高性能

  • 缓冲输出意味着您以后仍然可以在代码中操作HTTP头

  • 显式地在输出[head]....[/head]后刷新缓冲区可以允许浏览器在HTML流完成之前开始整理页面的其他资源

  • 在缓冲区中捕获输出意味着它可以重定向到其他功能,如电子邮件,或复制到文件中作为内容的缓存表示

  • 我更喜欢:

    ob_start();
    echo("Hello there!");
    $output = ob_get_clean(); //Get current buffer contents and delete current output buffer
    

    现有答案中未提及以下事项: 缓冲区大小配置 HTTP头 和筑巢

    ob_启动的缓冲区大小配置:

    ob_start(null, 4096); // Once the buffer size exceeds 4096 bytes, PHP automatically executes flush, ie. the buffer is emptied and sent out.
    
    上面的代码提高了服务器性能,因为PHP将发送更大的数据块,例如4KB(不需要ob_start调用,PHP会将每个回显发送到浏览器)

    如果开始缓冲时没有区块大小(即简单的ob_start()),那么页面将在脚本末尾发送一次

    输出缓冲不影响HTTP头,它们以不同的方式处理。但是,由于缓冲,您甚至可以在发送输出后发送头,因为它仍然在缓冲区中

    ob_start();  // turns on output buffering
    $foo->bar();  // all output goes only to buffer
    ob_clean();  // delete the contents of the buffer, but remains buffering active
    $foo->render(); // output goes to buffer
    ob_flush(); // send buffer output
    $none = ob_get_contents();  // buffer content is now an empty string
    ob_end_clean();  // turn off output buffering
    

    这里有很好的解释:

    这可以作为在一个PHP中拥有多个html页面并通过GET调用它们的一种方式吗?我想是的,但这听起来不是一个好主意。最好是从单独的模板加载它们。请注意,这种技术使用,而不是从未想到过,这是一种非常友好的IDE开发方式!另外,它消除了我在PHP中使用Javascript或HTML作为字符串的需要,不断地转义\“等,这会让你的视觉变得烦躁,并在页面上给出清晰的图片
    ob_start(null, 4096); // Once the buffer size exceeds 4096 bytes, PHP automatically executes flush, ie. the buffer is emptied and sent out.
    
    ob_start();  // turns on output buffering
    $foo->bar();  // all output goes only to buffer
    ob_clean();  // delete the contents of the buffer, but remains buffering active
    $foo->render(); // output goes to buffer
    ob_flush(); // send buffer output
    $none = ob_get_contents();  // buffer content is now an empty string
    ob_end_clean();  // turn off output buffering