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

6

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


2
使用什么工具/方法/平台在哪个级别上进行缓存? - Pekka
@Pekka 任何一种都可以,我只是想尽量减少我所做的 PHP 处理和数据库请求的数量。另外,我正在使用 CodeIgniter,如果有帮助的话。 - emkay
在十分钟前我开始回答之前,是的。在我的看法中,在一个问题中你永远不能提供太多的信息。 - Layke
@Layke 抱歉,虽然我认为框架并不重要,因为只要不完全依赖于我使用特定的框架,我可以尝试实现任何解决方案。如果我使用 CodeIgniter 框架,你会提供更相关的解决方案吗?顺便说一句,非常感谢你的回答。 - emkay
@Layke 我认为你的回答仍然有效,并且为这个问题增加了很大的价值。我回答了同样的事情(细节较少),因为我认为那个答案在任何情况下都可能有用。 - Fabio
4个回答

5

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

在您自己的应用程序中,您可以缓存数据,以便无需在每个请求上访问数据库。 Memcached 是一种流行的方法。


3

Zend_Cache

为此,我可能会使用Zend框架的Zend_Cache库。

您可以仅使用此组件,而不需要使用整个框架。

请前往Zend Framework 下载页面并获取最新版本。

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

您决定如何缓存数据了吗?您使用文件系统还是Memcache?一旦确定了您要使用哪个,您需要使用特定的Zend_Cache后端。

Zend_Cache 后端 / Zend_Cache 前端

  • 您需要使用后端(将要缓存的内容缓存在哪里)
  • 您需要使用前端(您想要如何进行缓存...例如使用缓冲区或缓存函数结果等)

后端文档:Zend_Cache 后端 前端文档:Zend_Cache 前端

因此,您可以这样做...

<?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,这是简单的。您将使用 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/

很抱歉这个问题写得比预期的时间长,而且已经有很多答案了!


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文档

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


@yes123 没问题,ZF 是一个任意使用的框架,只需 require 'Zend/Cache.php'; 就可以了。不过这只是一种方法,你甚至可以通过纯 PHP 和 output_buffering 函数实现相同的功能。 - Fabio

1
你可以使用ob_start()、ob_end_flush()等函数自己实现缓存。收集所需的输出,将其转储到某个文件或数据库中,并在条件相同的情况下稍后读取。我通常会生成状态的md5 sum,并在以后进行恢复。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接