2012-03-29 3 views
2

Я смущен в использовании функций ob_start и ob_start ("ob_gzhandler"). У меня есть тестовый скрипт php, в котором я пытаюсь реализовать простую систему кеширования. Вот сценарий:ob_start() буферизация вывода не работает с сжатием ob_gzhandler

<?php 

ob_start(); 

function writeCache($content, $filename) { 
    $fp = fopen($filename, 'w'); 
    fwrite($fp, $content); 
    fclose($fp); 
} 

function readCache($filename, $expiry) { 
if (file_exists($filename)) { 
    if ((time() - $expiry) > filemtime($filename)) 
    return FALSE; 
    $cache = file($filename); 
    return implode('', $cache); 
} 
return FALSE; 
} 

$headfile='cache/head.cache'; 
$headtime=86400; //1 day cache 
// check if a valid head cache exists 
if (!$head = readCache($headfile,$headtime)) { 

$title='testing output buffering in caching'; 
$description='this page is using ob_start for caching'; 
$keywords='ob_start,output,buffering'; 

echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xmlns:og="http://opengraphprotocol.org/schema/" xmlns:fb="http://www.facebook.com/2008/fbml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />'; 
echo '<meta name="description" content="'.$description.'" />'; 
echo '<meta name="keywords" content="'.$keywords.'" />'; 
echo '<meta name="title" content="'.$title.'" />'; 
echo '<link rel="icon" href="'.filemtime("favicon.ico").'/favicon.ico" type="image/x-icon" />'; 
echo '<link rel="shortcut icon" href="'.filemtime("favicon.ico").'/favicon.ico" type="image/x-icon"/>'; 
echo '<title>'.$title.' </title>'; 
echo '<link rel="stylesheet" type="text/css" href="/css/'.filemtime("css/style.php").'/style.php" media="screen" />'; 
echo '</head>'; 
echo 'head cached at '.date('Y-m-d H:i:s'); 
$head = ob_get_contents(); 
ob_clean(); 
writeCache($head,$headfile); 

} 

//body cache 
$bodyfile='cache/body.cache'; 
$bodytime=86400; //1 day cache 

// check if a valid body cache exists 
if (!$body = readCache($bodyfile,$bodytime)) { 

    echo '<body>'; 
    echo '<p>this is the body of html doc!</p>'; 
    echo '<p>this part of page was cached in buffer</p>'; 
    echo 'body cached at '.date('Y-m-d H:i:s'); 
    $body = ob_get_contents(); 
    ob_clean(); 
    writeCache($body,$bodyfile); 
} 

//footer cache 
$footerfile='cache/footer.cache'; 
$footertime=86400; //1 day cache 

// check if a valid footer cache exists 
if (!$footer = readCache($footerfile,$footertime)) { 

    echo '<p>this is a footer section!</p>'; 
    echo '</body></html>'; 
    echo 'footer cached at '.date('Y-m-d H:i:s'); 
    $footer = ob_get_contents(); 
    ob_clean(); 
    writeCache($footer,$footerfile); 
} 
ob_end_clean(); 
echo $head.$body.$footer; 
echo '<p>usual output of data...'.date('Y-m-d H:i:s'); 
?> 

Скрипт выводит эти строки:

head cached at 2012-03-29 19:34:36 

this is the body of html doc! 

this part of page was cached in buffer 
body cached at 2012-03-29 19:34:36 

this is a footer section! 
footer cached at 2012-03-29 19:34:36 

usual output of data...2012-03-29 20:13:59 

Все три файла кэша присутствуют в кэше, и все, кажется, работает нормально. Но прежде чем я осуществил буферизацию вывода в сценарии я имел

ob_start("ob_gzhandler",9); 

вместо

ob_start(); 

в начале сценария.

Так что я использовал сжатие gzip на своей тестовой странице. Теперь, если я попытаюсь изменить ob_start() на ob_start («ob_gzhandler», 9), я получил ошибку типа содержимого в моем браузере и окне blanc. Почему я не могу использовать не только буферизацию вывода, но и сжатие gzip на моей странице? Есть ли способ организовать кэширование буферизации вывода, как это, используя сжатие содержимого gzip?

Надеюсь, что кто-то знает ответ! Благодаря!

ответ

1

ошибка в PHP на использование ob_gzhandler, необходимо использовать ob_flush() или ob_end_flush() с этим вместо ob_end_clean() или ob_get_clean()

http://bugs.php.net/bug.php?id=34071

Я начинаю страницу с чем-то вроде этого:

if(substr_count($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip')){ 

    ob_start("ob_gzhandler"); 

}else{ 

    ob_start(); 

} 

Я заканчиваю страницу с этим:

ob_end_flush(); 

Я завернуть элементы, которые я хочу кэш:

ob_start(); and ob_get_clean(); 
+0

Я использовал завиток из командной строки, чтобы выяснить, в чем проблема, и выяснить, как приступить к работе в решении этого вопроса. Curl из командной строки является бесценным инструментом для определения истинного вывода в браузерах. Решила многие проблемы кодирования и другие вещи с ним в прошлом. –

+0

О, теперь я вижу! Спасибо за объяснение проблемы! Тогда я бы согласился с вашими советами об ob_end_flush и обернуть кеш с благодарностью! – Ksenia

Смежные вопросы