2014-09-25 111 views
0

我已經使用Codeigniter數據庫緩存一段時間,它工作得很好,但現在我有一個奇怪的問題與特定的查詢。步驟如下:爲什麼codeigniter數據庫緩存重新生成文件?

  1. 我的緩存目錄爲空。
  2. 我打開URL/myproject的/ myController的/ myaction/
  3. 文件將在myController的-myaction目錄緩存(我打開該文件與我的記事本,以確保它包含正確的數據。
  4. 我再次打開/ myproject/mycontroller/myaction /期待從緩存中檢索數據,結果是從數據庫中檢索數據並重新生成文件y我不知道爲什麼,但重點是生成的文件是。沒用

如果是對你很重要,我給你下一個信息:

  • 該查詢是一個存儲過程。
  • 我有其他正在完美工作的查詢。

如果您需要特定數據,請讓我知道,我非常感謝您的幫助。

謝謝。

使用Xdebug的我發現,在查詢功能的DB_driver.php文件,存在這樣說,如下行277的條件:

// Is query caching enabled? If the query is a "read type" 
    // we will load the caching class and return the previously 
    // cached query if it exists 
    if ($this->cache_on == TRUE AND (stristr($sql, 'SELECT'))) 
    { 
     if ($this->_cache_init()) 
     { 
      $this->load_rdriver(); 
      if (FALSE !== ($cache = $this->CACHE->read($sql))) 
      { 
       return $cache; 
      } 
     } 
    } 

該查詢必須是一個SELECT,和我使用一個存儲過程,我的模型是:

public function cobertura($param1= NULL) { 
     $query = $this->db->query("[SP_NAME] ?", array($param1)); 
    } 

    return $query->result(); 
} 

所以當我使用一個存儲過程,而不是一個SELECT語句,條件返回FALSE並再次生成緩存文件。

如何修改該函數以檢測我的存儲過程爲有效的語句?

非常感謝。

+1

嗨,你可以在你的控制器上發佈你的代碼? – PinoyPal 2014-09-26 05:05:55

+0

@PinoyPal,我添加了有用的信息,謝謝你的時間。 – 2014-10-06 15:00:18

回答

0

那麼,對於這個問題的解決方案是通過這個

if ($this->cache_on == TRUE AND (stristr($sql, 'SELECT') OR strpos($sql, '['))) 

修改此

if ($this->cache_on == TRUE AND (stristr($sql, 'SELECT'))) 

這樣,我告訴CI,當我的SQL statment用[是一個SELECT查詢也開始。

而當我有一個不是選擇語句的存儲過程只需禁用緩存。

如果你有更好的解決方案,你可以分享。

0

你不應該在CodeIgniter中使用查詢緩存。除非你確切地知道你在做什麼,否則不安全。

相反,我會創建一個cacheQuery函數或類似的東西,至少讓你控制查詢的緩存。任何返回數據或可能返回數據的查詢都可以被緩存的假設是非常危險的。

通過替換CI的嘗試自動化並手動執行它,您也將獲得一些速度。如果你的xdebug配置文件中的所有猜測配置文件都在處理你的查詢,那麼在查詢函數中增加很多開銷。

上面發佈的解決方案也可能有點不妥,因爲並非所有的存儲過程都會返回數據,並且方括號可能位於查詢中的任何位置,因此檢查可能會導致錯誤。如果第一個字符會返回false,並且如果該字符在查詢中的任何位置返回true,即使它不構成存儲過程也會返回true。例如,DELETE FROM table1 WHERE column1 =「[xxx]」。

這種事stristr($ sql,'SELECT')和strpos($ sql,'[')不好。 CodeIgniter簡單,整潔,一致且組織良好,但PHP代碼的實際質量非常差。公平地說,其中的一部分是因爲它與許多老版本的PHP保持兼容,但有幾件事情是莫名其妙的。當談到這種事情時,CodeIgniter的政策是「如果它能工作90%或更多的時間,那麼就可以」。這對於大型嚴肅的企業應用程序當然不是好事。