2010-02-24 344 views
0

我有一個歌曲控制器。在歌曲控制器我有一個 '視圖' 行動,其獲得的傳送ID,例如Cakephp緩存每個動作只緩存一個文件

  • /歌曲/圖/ 1
  • /歌曲/視圖/ 5
  • /歌曲/視圖/ 500

當用戶訪問/歌曲/查看/ 1,該文件被正確緩存並保存爲「songs_view_1.php」

現在的問題,當打到用戶的不同的歌曲,例如:/歌曲/圖/ 2,'songs_view_1.php'被刪除,'/songs/view/2.ph p'就在它的位置。

如果我不訪問其他網址,並且訪問其他操作不會影響任何其他操作的緩存文件,則cahced文件將在那裏停留一天。

我已經嘗試更換我的'蛋糕'文件夾(從1.2到1.2.6),但沒有做任何事情。我根本沒有收到任何錯誤消息,也沒有收到日誌。

這是我的代碼,我試過很多變化都以同樣的問題結束。

var $helpers = array('Cache'); 
    var $cacheAction = array(
     'view/' => '+1 day' 
    ); 

任何想法?

編輯:

一些更多的測試後,該代碼

var $cacheAction = array(
    'view/1' => "1 day", 
    'view/2' => "1 day" 
); 

將緩存 '視圖/ 1' 或 '視圖/ 2',但正如前面刪除以前的頁面。如果我參觀「/視圖/ 3」,它會刪除前的緩存頁面... 嘆息

編輯:

與具有相同的代碼,另一臺服務器上的同一個問題...

回答

1

這方面的工作小時之後,我終於明白,爲什麼緩存保持被刪除的原因,是因爲你有一些操作數據庫中的更新您的「歌」記錄您查看「歌后」。就我而言,我在我的數據庫中保留了一個名爲'Hits'的列來存儲命中次數/讀數,並且每次讀取記錄時都會更新它。

Cakephp具有一種功能,可以檢測數據庫的更改並清除緩存。

嘗試刪除任何更新您的'歌曲'記錄並且cacheaction應該正常工作的操作。

另一種方法是重新定義'歌曲'模型中的clearcache函數...它將禁用自動清除緩存的函數..但是請記住在執行更新時手動清除緩存。

function _clearCache($type = null) { 

} 
+0

這很好,在覆蓋clearCache函數時我無法使用它,但當我有更多時間時,我會再去一次。 我正在更新數據庫中的每個歌曲的點擊次數,這就是問題所在。 這讓我沮喪幾個月!我不敢相信這很簡單。謝謝。 – 2010-05-04 23:58:03

0

我認爲這種緩存方法是被取消的。也許你應該使用Cache

$song = Cache::read('songs/view/'.$id, 'cache_time'); 
if(empty($song)){ 
    $song = $this->Song->findById($id); 
    Cache::write('songs/view/'.$id, $song, 'cache_time'); 
} 

cache_time是您在core.php定義一個變量:

Cache::config('cache_time', array('engine' => 'File', 'duration' => 60*60*24)); 

希望它能幫助。

+1

緩存查詢結果和緩存呈現的頁面是不太一樣的。什麼時候頁面緩存被棄用? – deceze 2010-02-24 05:29:24

+0

我說'我想'。 – metrobalderas 2010-02-24 06:48:51

+1

那麼請不要沒有任何參考地說出來。我開始懷疑我是否無法將我的網站更新到更新的Cake版本,因爲我正在使用頁面緩存。 :) – deceze 2010-02-24 07:52:05

0

檢查config.php文件中的一些設置。你是否啓用了以下設置?

Configure::write('debug', 0); 
//Configure::write('Cache.disable', true); 
Configure::write('Cache.check', true); 
Cache::config('default', array('engine' => 'File')); 
+0

是的,我有這些確切的設置。 – 2010-02-25 22:56:46

1

在這段時間的工作時間後,我終於找出緩存不斷被刪除的原因。 原因是因爲在查看'歌曲'後,您有一些操作可以更新數據庫中的'歌曲'記錄。就我而言,我在我的數據庫中保留了一個名爲'Hits'的列來存儲命中次數/讀數,並且每次讀取記錄時都會更新它。

Cakephp具有自動檢測數據庫更改並清除緩存的功能。

嘗試刪除任何更新您的'歌曲'記錄的操作,並且cacheaction應該正常工作。

修復後,會出現另一個問題。比方說,如果有任何更新任何 1的記錄...緩存歌曲/ 1,歌曲/ 5,歌曲/ 100 ...等等的所有緩存, 1,歌曲/ 5,歌曲/ 100將被刪除。這使得cacheaction經常更新網站無用。

解決方案是重新定義您的'歌曲'模型中的clearcache函數...它將禁用函數來自動清除緩存..所以如果有任何更新,沒有緩存將是刪除。但是請記住在執行更新時手動清除緩存。

function _clearCache($type = null) { 

} 

手動刪除緩存,你可以使用

@unlink(CACHE.'views'.DS.'website_songs_view_50.php');