什么';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中堆叠多个缓冲区是可能的。见()
至于为什么
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