1

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

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

谢谢。

编辑

在这种情况下我应该简单地使用database cache而不是吗?Web page cache

4

4 回答 4

3

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

$config['cache_query_string'] = TRUE;
于 2017-01-28T17:36:03.590 回答
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'
);

我还没有测试它,它可能需要一些调整才能工作......

于 2013-01-25T06:57:14.570 回答
1

我在 CI 3+ ,文件系统/核心/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);

    }

并将字符串添加到您的 application/config/config.php

$config['cache_query_string'] = true;

它适用于 GET、POST、COOKIE .... 如果只需要 GET,只需 $config['cache_query_string'] = true; - 足够的

于 2017-10-04T14:35:18.130 回答
0

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

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

编辑:system/core/Output.php

如果找到特定参数,则添加 Condition 以防止写入缓存: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;
    }
    ...
    ...
}

如果找到特定参数,则添加 Condition 以防止显示缓存: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;
    }
    ...
    ...
}
于 2014-11-12T12:44:44.310 回答