php缓冲区在ob_end_clean之后不会停止

时间:2012-04-27 14:57:03

标签: php buffering

使用以下代码缓冲布局文件。 在本地服务器上工作正常,但在实时服务器上它保持缓冲,直到PHP放弃。这会导致旋转进度条和页面中javascript的延迟执行。看起来像ob_end_clean()并没有真正退出缓冲。

ob_start();
require($layoutfile);
$return = ob_get_contents();
ob_end_clean();
return $return;

当我在冲洗后回显空格时,缓冲区停止并且每件事情都正常。但在这种情况下,我不会在屏幕上打印任何内容。

ob_start();
require($layoutfile);
$return = ob_get_contents();
if(ob_end_clean()) echo " ";
return $return;

有人遇到过这个吗?

3 个答案:

答案 0 :(得分:0)

对于有缓冲问题的人:

尝试echo ob_get_level()查看您所在的图层。如果此函数返回的值超过0,则表示您仍在缓冲区内。

要关闭所有图层以防止出现问题,请执行以下操作:

while (@ob_end_clean()) {  
    // do nothing   
}

这将删除所有图层。

在此之后,您可以继续前进 - 即使只使用flush()代替ob_flush()

您提到它适用于您的其他服务器。您是否像here一样激活了gzip压缩?

答案 1 :(得分:0)

适用于我的代码是:

<?php

include "../connect/connectdb.php";

$txtIdCaso = $_GET['WWW_id_caso'];

$sql = "SELECT * FROM caso_solicitud
        WHERE id_caso = '".$txtIdCaso."'";


$result = mysqli_query($conn, $sql);
$row    = mysqli_fetch_array($result);

header('Content-Description: File Transfer');
header('Content-type: "'.$row['tipo_archivo'].'"');
header('Content-Disposition: attachment; filename="'.$row['nombre_archivo'].'"');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
header('Pragma: public');
header("Content-length: ".$row['longitud_archivo']);

while (@ob_end_clean()) {  
// do nothing   
}

die($row['doc_solicitud']);
?>
希望能有所帮助。我测试了几种格式并且工作正常。

问候。

答案 2 :(得分:0)

我猜在ob_end_clean之后有输出。使用die / exit / header可以正常工作(意味着HTML中没有任何内容)。我遇到了类似的问题,但得到了解决方案。 输出缓冲处理输出到客户端,该函数清除所有内容直到执行。