我是CI缓存的新手。我在codeigniter页面缓存方面遇到了一些奇怪的问题。 $this->output->cache(300);
我期待如果GET[]
中的参数发生变化,则不会加载缓存版本。但它正在加载缓存而不考虑任何GET[]
参数。
我有一个页面说明评论是否已保存[通过获取参数],
/product/product-name/?saved=true
重定向到评论表单所在的同一页面。但它没有用。如何根据get参数使旧缓存无效并创建新缓存?或者我需要改变评论系统的行为?
感谢。
修改
在这种情况下,我应该只使用database cache
代替Web page cache
吗?
答案 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;
}
...
...
}