ob_start并包含问题

时间:2013-02-28 22:49:28

标签: php output-buffering

我们的网站已经存在了几年,而且发生了一些变化,这真的很奇怪。我尝试过与托管交谈,但没有得到解决。

问题是第一个包含文件中第一个<?php标记之前的所有内容在进入OB之前直接输出

例如:

<?php
ob_start();
?>
<h1>Welcome</h1>
<?php 
include('contentbox1.php'); 
include('contentbox2.php'); 
include('contentbox3.php'); 
?>
<b>Bye</b>
<?php
$content = ob_get_contents();
ob_end_clean();
echo("Included{".$content."}");
?>

得到的输出是:(注意<h1>Welcome</h1>与缓冲区内输出的其余内容不一致)

<h1>Welcome</h1>
Included{
<div id="contentbox1"></div>
<div id="contentbox2"></div>
<div id="contentbox3"></div>
<b>Bye</b>
}

正确的输出应该是什么(并且在我的本地机器上):

Included{
<h1>Welcome</h1>
<div id="contentbox1"></div>
<div id="contentbox2"></div>
<div id="contentbox3"></div>
<b>Bye</b>
}

这对我们的网站造成了重大问题,我无法弄清楚原因。它在我的本地机器上完美运行,而不是我们多年来一直使用的主机。

解: 事实证明,当我重新上载test.php时,我网站上的内容框和许多其他文件都很有趣并且可能已损坏。一旦我重新上传我的整个网站(即使没有发生代码更改),我的网站运行缓慢现在超级快,所有问题都消失了。我的文件也被其他主机损坏了,所以如果你将来也有奇怪的东西,请记住这一点。

2 个答案:

答案 0 :(得分:3)

您的代码已正确执行,因为这是ob_get_clean的工作方式:

ob_get_clean()

ob_get_clean — Get current buffer contents and delete current output buffer
  

返回输出缓冲区和结束输出缓冲的内容。如果   输出缓冲未激活,然后返回FALSE。

使用ob_get_contents();

ob_start();
include('test.php');
$content = ob_get_contents();
ob_end_clean();
echo("Included{".$content."}");

更新

<?php
ob_start();
?>
<h1>Welcome</h1>
<?php 
include('contentbox1.php'); 
include('contentbox2.php'); 
include('contentbox3.php'); 
?>
<b>Bye</b>
<?php
$content = ob_get_contents();
ob_end_clean();
echo("Included{".$content."}");
?>

答案 1 :(得分:0)

尝试以下方法:

将其添加到test.php的开头

<?php include("empty_file.php"); ?>

empty_file.php的内容:

<?php
echo "";
?>