Я запутался в использовании функций ob_start и ob_start ("ob_gzhandler").У меня есть тестовый скрипт php, в котором я пытаюсь реализовать простую систему кеширования.Вот скрипт:
<?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), я получаю ошибку типа контента в моем браузере и пустом окне.Почему я не могу использовать не только буферизацию вывода, но и сжатие gzip на своей странице?Есть ли способ организовать кэширование выходной буферизации, например, с помощью сжатия содержимого gzip?
Надеюсь, кто-нибудь знает ответ!Спасибо!