PHP输出缓冲区堆叠

时间:2009-06-15 06:34:38

标签: php buffer

以下是没有达到我想要的目标

<?
echo ob_start() . "<br>";
echo "1x<br>";
echo ob_start() . "<br>";
echo "2x<br>";
echo ob_flush() . "<br>";
echo "3x<br>";
echo ob_flush() . "<br>";
?>

输出如下

1
1x
1
2x
1
3x
1

我想要的东西是

1x
3x
2x

我认为问题在于它将第二个ob_start()的输出放在第一个输出缓冲区中。但是我如何得到我想要的输出?

基本上我想要实现的是在输出的后一点提供需要位于HTML文档头部的标记。即,在脚本已经打印出需要提供的文档头信息之后,在脚本的一半处。

5 个答案:

答案 0 :(得分:2)

请参阅ob_start的PHP手册。你不想

echo ob_start();

因为该函数返回true或false,所以它将输出1或0 代替

ob_start();
echo "1x" . "<br />";
echo "2x" . "<br />";
echo "3x" . "<br />";
ob_flush();

总的来说,你的目标不是很明确。 ob_start()用于在发送之前清理一堆输出。它不应该用作堆栈。

如果要在PHP中使用堆栈,请尝试SplStack

答案 1 :(得分:1)

你为什么不写

echo "1x"."<br>";
echo "3x"."<br>";
echo "2x"."<br>";

答案 2 :(得分:1)

以下内容如何:

<?php
echo ob_start();
echo "1x<br>";
$keep_me_1 = ob_get_contents(); /* optional and for later use */
echo ob_flush();

echo ob_start();
echo "3x<br>";
$keep_me_2 = ob_get_contents(); /* optional and for later use  */
echo ob_flush();

echo ob_start();
echo "3x<br>";
$keep_me_3 = ob_get_contents(); /* optional and for later use  */
echo ob_flush();

?>

如果您想使用更多“堆叠”功能,请查看ob_end_flush

答案 3 :(得分:0)

您可以使用ob_get_contents()将内部缓冲区的内容保存为字符串,然后调用ob_end_clean()将内容丢弃。稍后,在外部缓冲区中使用回调函数来写出字符串。

答案 4 :(得分:0)

您的问题是ob_*函数不应该是echo

<?
ob_start() . "<br>";
echo "1x<br>";
ob_start() . "<br>";
echo "2x<br>";
ob_flush() . "<br>";
echo "3x<br>";
ob_flush() . "<br>";
?>

ob_start()函数返回一个布尔值。基本上,您的代码只是回显true值,转换为字符串时转换为1