如何打破ob_start()并在某些标签后继续

时间:2012-10-11 08:14:45

标签: php caching ob-start

我想为电子商务平台构建一个缓存系统。

我选择在页面末尾使用ob_start('callback')ob_end_flush()

我将验证是否为访问过的网址创建了任何.cache文件,如果有文件,我会打印出其内容。

我的问题是我想保持购物车的实时,所以我不想缓存它。我怎样才能做到这一点?

<?php

    function my_cache_function($content) {
        return $content;
    }

    ob_start('my_cache_function');

<!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">
<head>
<title>test</title>
</head>
<body>
     test
     <?php
         //some ob_break() ?
     ?>
     <div id="shopping-cart">
         this should be the content I do not want to cache it
     </div>
     <?php
         // ob_continue() ?
     ?>

</body>
</html>
<?php
     ob_end_flush();
?>

提前谢谢!

3 个答案:

答案 0 :(得分:1)

如果你这样做,问题是内容将在之前放置的任何HTML之前输出。您可能想要的是将该内容保存在某个变量中,然后在缓存“模板”文件中使用占位符,例如%SHOPPING-CART%

因此,您可以使用具有真实非缓存内容的str_replace替换它。

答案 1 :(得分:1)

你可以这样做:

<?php

    function my_cache_function($content) {
        return $content;
    }
    $output = "";
    ob_start('my_cache_function');

<!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">
<head>
<title>test</title>
</head>
<body>
     test
     <?php
         $output .= ob_get_clean();
     ?>
     <div id="shopping-cart">
         this should be the content I do not want to cache it
     </div>
     <?php
         ob_start();
     ?>

</body>
</html>
<?php
         $output .= ob_get_clean();
         echo $output;
?>

即使这没有意义。

答案 2 :(得分:1)

我不确定Zulakis解决方案是否一路走来......这种改变怎么样?

<?php
$pleaseCache=true;
function my_cache_function($content) {
    if($pleaseCache)
    {
        /// do your caching
    }
    return $content;
}
$output = "";
ob_start('my_cache_function');

<!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">
<head>
<title>test</title>
</head>
<body>
     test
     <?php
         $output .= ob_get_clean();
         $pleaseCache = false;
         ob_start('my_cache_function');
     ?>
     <div id="shopping-cart">
         this should be the content I do not want to cache it
     </div>
     <?php
         $output .= ob_get_clean();
         $pleaseCache = true;
         ob_start('my_cache_function');
     ?>

</body>
</html>
<?php
     $output .= ob_get_clean();
     ob_end_clean();
     echo $output;
?>

同样,不确定这有多大意义......但你有我预设的理由。