2012-04-27 5 views
1

Со следующим кодом я буфера файла макета. На локальном сервере работает нормально, но на реальном сервере он сохраняет буферизацию до тех пор, пока php не сдастся. Это приводит к появлению индикатора прогресса и задержке выполнения javascript на странице. Похоже, ob_end_clean() не перестает буферизировать.php-буфер не останавливается после 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; 

Кто-нибудь сталкивался с этим?

+0

Вы пытались использовать 'ob_flush'? – kuba

+0

@Charles yes - это опечатка – waterschaats

+0

@kuba с 'ob_flush' удаляет '$ return' var – waterschaats

ответ

0

Для тех, кто возникли проблемы буфера:

Попробуйте echo ob_get_level(), чтобы увидеть, в каком слое вы. Если эта функция возвращает более 0, вы все еще находитесь в буфере.

Чтобы закрыть все слои предотвратить проблемы, выполните следующие действия:

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

Это удалит все слои.

После этого вы можете двигаться дальше - даже с flush() вместо ob_flush().

Вы упомянули, что оно работает на вашем другом сервере. У вас активировано сжатие gzip, например here?

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']); 
?> 

Надежда, которая может помочь. Я тестировал несколько типов форматов и прекрасно работал.

Приветствия.

0

Я думаю, что есть выход после ob_end_clean. Использование die/exit/header будет работать нормально (значит, в HTML не будет ничего). Я просто столкнулся с подобной проблемой, но получил решение. Буферизация вывода связана с выходом на клиентскую сторону, и функция очищает все до тех пор, пока оно не будет выполнено.