【问题标题】:Codeigniter Page cache with GET parameter带有 GET 参数的 Codeigniter 页面缓存
【发布时间】:2013-01-25 06:40:15
【问题描述】:

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

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

谢谢。

编辑

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

【问题讨论】:

  • 为时已晚,但我遇到了同样的问题并在下面提供了解决方案。 :)

标签: codeigniter caching


【解决方案1】:

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

$config['cache_query_string'] = TRUE;

【讨论】:

  • 谢谢。这应该是公认的答案,因为不会更改任何核心文件,也不需要额外的代码或功能。像魅力一样工作 =)
【解决方案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'
);

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

【讨论】:

  • 不确定我是否明白你在说什么。是否可以删除特定的page cache 文件或只是跳过缓存页面并加载默认页面。
  • 我尝试将$this-&gt;output-&gt;cache(300); 置于if 条件下,但未传递GET[] 参数。但它没有帮助。如果指定了参数,我需要删除/跳过缓存文件。
  • 一旦页面被缓存,您不能跳过它,除非缓存文件被删除或超过 300 秒。
  • 这需要一些时间来实现,现在我将使用数据库级缓存。需要快速修复。当我尝试此代码时,我一定会让您知道。谢谢你的时间:)
  • 嗨,Clifford,现在我对钩子做了一些工作,可以在加载缓存副本之前覆盖缓存函数。上面代码的问题是它在指定GET[] 时创建了新的缓存。即使GET[] 没有参数,也会加载缓存副本。我想要的是,如果指定了GET[],则无需创建缓存。就像禁用缓存一样加载页面。我可以删除缓存的副本吗?我在这里缺少一些愚蠢的东西!
【解决方案3】:

我在 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);

    }

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

$config['cache_query_string'] = true;

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

【讨论】:

    【解决方案4】:

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

    为了快速和简单的解决方案,我添加了两个条件来显示缓存和写入缓存,如果查询字符串参数定义了变量(在我的情况下为 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;
        }
        ...
        ...
    }
    

    【讨论】:

      猜你喜欢
      • 2015-09-26
      • 1970-01-01
      • 2012-03-26
      • 1970-01-01
      • 2012-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-24
      相关资源
      最近更新 更多