2013-03-24 115 views
1

當我爲自定義頁面使用HTTP緩存時,Symfony2會在緩存文件夾下爲它創建一個文件,並且可以爲此緩存設置超時。但是,當我更新某些與特定頁面相關的數據庫信息時,我的用戶無法看到更改(取決於緩存的使用時間)。爲了解決這個問題,我想刪除一個特定的文件在更新行動與該網頁的URI,但我不知道該怎麼做!刪除特定URI的緩存文件

你知道如何用它的URI或其他任何方式刪除一個緩存的文件來解決這個問題嗎?

+1

讀它http://symfony.com/doc/2.0/book/http_cache.html – 2013-03-24 08:18:48

+0

在symfony的書說:「最標準的方法是通過請求特定的URL以清除特定URL的緩存「PURGE HTTP方法」。但是我怎樣才能從symfony控制器內部創建一個PURGE HTTP方法? – Developer 2013-03-26 09:09:25

回答

1

對我而言,這個工作,但我已經修改了我的環境課。你必須使用你自己的緩存路徑與環境:

private function clearCache($slug) 
{ 
    global $kernel; 
    if (get_class($kernel) == 'AppCache') { 
     $key = 'md' . hash('sha256', ($_SERVER['SERVER_PORT'] == 80 ? 'http://' : 'https://') . $_SERVER['HTTP_HOST'] . '/' . $slug); 
     $cacheMdFileName = \Environment::instance()->getCachePath() . '/' . $kernel->getKernel()->getEnvironment() . DIRECTORY_SEPARATOR . 'http_cache' . DIRECTORY_SEPARATOR . substr($key, 0, 2) . DIRECTORY_SEPARATOR . substr($key, 2, 2) . DIRECTORY_SEPARATOR . substr($key, 4, 2) . DIRECTORY_SEPARATOR . substr($key, 6); 
     $file = file_get_contents($cacheMdFileName); 
     $key = unserialize($file)[0][1]['x-content-digest'][0]; 
     $cacheEnFileName = \Environment::instance()->getCachePath() . '/' . $kernel->getKernel()->getEnvironment() . DIRECTORY_SEPARATOR . 'http_cache' . DIRECTORY_SEPARATOR . substr($key, 0, 2) . DIRECTORY_SEPARATOR . substr($key, 2, 2) . DIRECTORY_SEPARATOR . substr($key, 4, 2) . DIRECTORY_SEPARATOR . substr($key, 6); 

     unlink($cacheMdFileName); 
     unlink($cacheEnFileName); 
    } 
}