2013-01-25 67 views
1

我是CI緩存的新手。我正在面臨Codeigniter頁面緩存的一些奇怪問題。 $this->output->cache(300); 我期待如果GET[]中的參數改變,那麼緩存的版本將不會加載。但它正在加載緩存而不考慮任何GET[]參數。具有GET參數的Codeigniter頁面緩存

我有一個頁面,說明是否已保存評論[通過獲取參數], /product/product-name/?saved=true重定向到評論表單所在的同一頁面。但它不起作用。我如何使舊緩存無效並根據get參數創建新緩存?或者我需要改變我的評論系統的行爲?

謝謝。

編輯

我應該簡單地用database cache,而不是Web page cache在這種情況下?

+0

它太晚了,但我面臨同樣的問題並提供瞭解決辦法。 :) –

回答

2

創建一個cache_override掛鉤來檢查是否設置了任何GET []變量,然後跳過cache_override。

[編輯#1]

下面是一個例子:

在你的鉤子目錄下創建這個文件:

<?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; 
     } 
    } 

} 

然後將其添加到配置/ hooks.php:

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

我還沒有測試過,它可能需要稍微調整才能工作...

+0

不知道如果我得到你在說什麼。是否有可能刪除特定的「頁面緩存」文件或簡單地跳過緩存頁面並加載默認頁面。 – user3526

+0

我試着把'$ this-> output-> cache(300);'in if條件中,當沒有'GET []'參數傳遞時。但它沒有幫助。如果指定了參數,我需要刪除/跳過緩存文件。 – user3526

+0

緩存頁面後,您不能跳過它,除非緩存文件被刪除或更老,然後300秒。 –

0

我發現沒有更簡單的方法使用Hooks來防止寫入緩存,因爲其調用_write_cache()裏面的_display()方法本身的CI_Output類。

爲了快速和最簡單的解決方案,我增加了兩個條件來顯示緩存和寫高速緩存,如果查詢字符串參數已變量定義(在我的情況offset,因爲我想用於分頁)

編輯:系統/型芯/ 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; 
    } 
    ... 
    ... 
} 
1

你只需要能夠在config/config.php文件cache_query_string選項。

$config['cache_query_string'] = TRUE; 
1

我測試CI 3+,文件系統/核心/輸出。PHP的559線,更改此

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

    } 

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

並添加字符串到你的application/config/config.php文件

$config['cache_query_string'] = true; 

它會工作,GET,POST, COOKIE .... 如果只需要GET,只需$ config ['cache_query_string'] = true; - 足夠