使用GET参数的Codeigniter页面缓存

时间:2013-01-25 06:40:16

标签: codeigniter caching

我是CI缓存的新手。我在codeigniter页面缓存方面遇到了一些奇怪的问题。 $this->output->cache(300); 我期待如果GET[]中的参数发生变化,则不会加载缓存版本。但它正在加载缓存而不考虑任何GET[]参数。

我有一个页面说明评论是否已保存[通过获取参数], /product/product-name/?saved=true重定向到评论表单所在的同一页面。但它没有用。如何根据get参数使旧缓存无效并创建新缓存?或者我需要改变评论系统的行为?

感谢。

修改

在这种情况下,我应该只使用database cache代替Web page cache吗?

4 个答案:

答案 0 :(得分:2)

创建一个cache_override挂钩以检查是否设置了任何GET []变量,然后跳过cache_override。

[编辑#1]

以下是一个例子:

在hooks目录中创建此文件:

<?php

class GetChecker {

    public function checkForGet()
    {
        global $OUT, $CFG, $URI;

        if (isset($_GET) AND ! empty($_GET))
        {
            return;
        }

        if ($OUT->_display_cache($CFG, $URI) == TRUE)
        {
            exit;
        }
    }

}

然后将其添加到config / hooks.php:

$hook['cache_override'][] = array(
    'class' => 'GetChecker',
    'function' => 'checkForGet',
    'filename' => 'GetChecker.php',
    'filepath' => 'hooks'
);

我还没有测试过,可能需要稍微调整才能工作......

答案 1 :(得分:2)

您只需在cache_query_string文件中启用config/config.php选项。

$config['cache_query_string'] = TRUE;

答案 2 :(得分:1)

我测试CI 3 +,文件系统/ core / Output.php 559行,更改此

if ($CI->config->item('cache_query_string') && !empty($_SERVER['QUERY_STRING']))
    {
        $uri .= '?'.$_SERVER['QUERY_STRING'];
    }

在此

if ($CI->config->item('cache_query_string') /* && ! empty($_SERVER['QUERY_STRING']) */ && !empty($_REQUEST))
    {
        // $uri .= '?'.$_SERVER['QUERY_STRING'];
        $uri .= '?'.http_build_query($_REQUEST);

    }

并将字符串添加到您的应用程序/ config / config.php

$config['cache_query_string'] = true;

它将与GET,POST,COOKIE一起工作.... 如果只需要GET,只需$ config ['cache_query_string'] = true; - 够了

答案 3 :(得分:0)

我发现使用Hooks阻止写入缓存没有更简单的方法,因为它在_write_cache()类的_display()方法本身内调用了CI_Output

为了快速和最简单的解决方案,我添加了两个条件来显示缓存和写缓存,如果查询字符串参数已定义变量(在我的情况下offset,我想要分页)

编辑:system / core / Output.php

添加条件以防止写入缓存,如果找到特定的GET参数:

function _write_cache($output)
{
    if (isset($_GET['offset']) AND ! empty($_GET['offset']))
    {
        log_message('debug', " Don't write cache please. As as its matching condition");
        return;
    }
    ...
    ...
}

添加条件以防止显示缓存,如果找到特定的GET参数:

function _display_cache(&$CFG, &$URI)
{
    if (isset($_GET['offset']) AND ! empty($_GET['offset']))
    {
        log_message('debug', " Don't display cache please. As as its matching condition");
        return FALSE;
    }
    ...
    ...
}