在PHP中仅缓存页面的一部分

时间:2011-08-31 08:51:02

标签: php caching

是否可以仅在PHP中缓存页面的特定部分,或者在PHP脚本中缓存特定代码段的输出?似乎当我尝试缓存特定页面时,它会缓存整个页面,这不是我想要的,我的页面中的一些内容应该在每个页面加载时更新而其他页面(例如包含来自数据库的数据的下拉列表) )只需要每小时更新一次。

4 个答案:

答案 0 :(得分:5)

如果您正在谈论浏览器(以及它可能与之交互的任何代理)的缓存,那么不。缓存仅发生在完整的HTTP资源上(即基于每个URI)。

在您自己的应用程序中,您可以缓存数据,这样您就不需要(例如)在每个请求中访问数据库。 Memcached是一种流行的方法。

答案 1 :(得分:3)

调用Zend_Cache

我可能会使用Zend Frameworks Zend_Cache库。

您可以使用此组件而无需使用整个框架。

跳到Zend Framework Download Page并抓住最新的。

下载核心文件后,您需要在项目中包含Zend_Cache。 Zend_Cache个文档。

您是否已决定如何缓存数据?你在使用文件系统吗?或者你是memcache?一旦知道了要使用的内容,就需要使用特定的Zend_Cache后端。

Zend_Cache后端/ Zend_Cache前端

  • 您需要使用后端(如何在存储中缓存您想要缓存的内容)和
  • 你需要使用一个前端(你如何实际想要缓存...比如使用缓冲区,或者缓存函数结果等)。

后端文档:Zend_Cache Backends 前端文档:Zend_Cache Frontends

所以你会做这样的事情......

<?php
// configure caching backend strategy
$backend = new Zend_Cache_Backend_Memcached(
    array(
        'servers' => array( array(
            'host' => '127.0.0.1',
            'port' => '11211'
        ) ),
        'compression' => true
) );

// configure caching frontend strategy
$frontend = new Zend_Cache_Frontend_Output(
    array(
        'caching' => true,
        'cache_id_prefix' => 'myApp',
        'write_control' => true,
        'automatic_serialization' => true,
        'ignore_user_abort' => true
    ) );

// build a caching object
$cache = Zend_Cache::factory( $frontend, $backend );

这将创建一个使用Zend_Cache_Frontend_Output缓存机制的缓存。

要使用您想要的Zend_Cache_Frontend_Output,它将是simple。您可以使用output代替核心。您传递的选项是相同的。然后使用它你会:

Zend_Cache_Frontend_Output - 用法

// if it is a cache miss, output buffering is triggered
if (!($cache->start('mypage'))) {

    // output everything as usual
    echo 'Hello world! ';
    echo 'This is cached ('.time().') ';

    $cache->end(); // output buffering ends

}

echo 'This is never cached ('.time().').';

实用博客:http://perevodik.net/en/posts/14/

对不起,这个问题的写作时间比预期的要长,而且我已经写了很多答案!

答案 2 :(得分:1)

您可以使用ob_start(),ob_end_flush()和类似函数来滚动自己的缓存。收集所需的输出,将其转储到某个文件或数据库中,如果条件相同则稍后读取。我通常会建立状态的md5总和,然后再恢复它。

答案 3 :(得分:1)

这取决于您使用的缓存和视图技术。一般来说是的,你可以这样做:

// if it is a cache miss, output buffering is triggered
if (!($cache->start('mypage'))) {

    // output everything as usual
    echo 'Hello world! ';
    echo 'This is cached ('.time().') ';

    $cache->end(); // output buffering ends

}

echo 'This is never cached ('.time().').';

取自Zend_Cache documentation

否则在您的示例中,您始终可以创建一个函数,该函数返回下拉列表并在该函数内实现缓存机制。通过这种方式,您的页面甚至不知道缓存。