2010-06-24 28 views
12

有時我會在本地實施更改,並且它們工作正常,我將它們複製到我的遠程網絡服務器,並且更改將被忽略。 (代碼是相同的。)cakephp - 爲什麼一些更改不會發生,直到我將調試切換到3?

我進入core.php,將調試更改爲3,再次檢查...它的工作原理!

我有一種感覺,這是與緩存有關,但我不知道究竟要改變什麼。

+0

類似:http://stackoverflow.com/questions/14716004/cakephp-database-table-missing-datasource-default – trante 2014-12-10 19:13:31

回答

25

CakePHP的緩存位於/app/tmp/cache。目錄結構如下所示:

# /app/tmp/cache 
# /app/tmp/cache/models 
# /app/tmp/cache/persistent 
# /app/tmp/cache/views 

通常遇到的主要問題是模型緩存。當調試關閉時(即在生產中)並且導致CakePHP分派時,它會反思所有數據庫表的模式,並將它們存儲在上面的models文件夾中的平面文件中。如果你沒有刪除這個文件夾中的文件,CakePHP會開始說,模型/表/字段在你的數據庫中顯然是不存在的。

如果在應用程序中啓用視圖緩存,則當第一次呈現視圖時,CakePHP會將平面文件編譯到views文件夾,以防止必須在下一個請求中再次呈現這些視圖。

在CakePHP的引導過程中,它必須確定您安裝時使用的目錄結構,然後才能訪問重要文件(如database.php)。因此,CakePHP將生成緩存文件到persistent目錄,其中包含每個重要目錄和文件的絕對路徑,您正在使用的任何插件以及您創建的任何本地化,因此它可以在不重寫.pot文件的情況下快速翻譯您的應用程序。

因此,簡單地說,每當您對正在生產的應用程序進行代碼更改時,您都必須記住刪除這些目錄中的所有文件,或者將其添加爲deployment mechanism的一部分。您不得刪除任何目錄但是。

將調試更改爲3的原因是因爲當打開調試模式(任何值大於零)時,緩存將在每次請求中清除並重新生成,但是 - 雖然這起作用 - 但自動化並不容易。

有許多方法可以以編程方式執行此操作 - 包括shell commands,CakePHP pluginsCapistrano configs,Ant文件 - 但也可以手動執行此操作。

+0

非常好的答案,非常感謝。 – Owen 2010-06-25 13:52:07

+1

耶,設置'配置::寫(「Cache.disable」,真);'是沒有緩存有用。 – 2014-03-26 15:19:44

1

我認爲這是客戶端問題。你有安裝Firefox Mozilla的Web Developer addon嗎?如果是的話,你可以輕鬆地停用客戶端的緩存來檢查。

如果您更改調試級別,它會再次運行,因爲那麼url和cookie數據可能會略有不同,從而導致服務器重新加載。如果它仍然不起作用,那麼它一定是服務器端緩存...

注意:除此之外,你可以做所有類型的有用的東西,用於web開發與該插件如動態修改css或可視化樣式疊加在頁面上。

+0

感謝Web Developer插件提示。我認爲我已經通過將Cache :: config('default',array('engine'=>'File','duration'=> 0))來禁用緩存。在core.php - 我想我做錯了? – Owen 2010-06-24 17:30:25

2

這絕對是緩存。在服務器端,如果您啓用了緩存,請不要懷疑緩存是否會發生。您可以在core.php中關閉此功能,或者更有可能在升級應用時清除緩存Cache::clear()。在客戶端,您可能需要調整瀏覽器以完全禁用緩存。

+0

...是Cache :: clear()最好放在控制器中嗎? – Owen 2010-06-24 17:31:47

+0

無論你想要什麼。你可以有一個特殊的,受限制的控制器動作來清除所有的服務器端緩存。升級後您只需訪問它的網址。 – sibidiba 2010-06-24 18:49:21

+0

調整瀏覽器不會影響服務器端緩存,當然? – Leo 2010-06-25 08:20:10

1

我有同樣的問題,並deizel,給了一個很好的解釋,只是想補充,如果你不做很多的改變,簡單的方法,而不刪除或刪除緩存數據,或這樣的,是調試級別從0更改爲3,刷新網頁,您所做的重新設置調試上PO文件的變化,以及0

6

您可能會發現在CakePHP的1.2,1.3清除緩存這個有用的和我認爲這將在2.x中工作(一點點修改使用新CakeRequest類):

if(Configure::read('debug') > 0 and isset($this->params['url']['emptycache'])) { 
     // clear Cache::write() items 
     Cache::clear(); 
     // clear core cache 
     $cachePaths = array('views', 'persistent', 'models'); 
     foreach($cachePaths as $config) { 
      clearCache(null, $config); 
     } 
     $this->Session->setFlash('Cache cleared', 'default', array(), 'info'); 
    } 

這種添加到您的AppController :: beforeFilter()。

基本上當你在開發模式的時候,上面的代碼可以讓你輕鬆清除例如追加一個查詢字符串的URL緩存mydomain.com/?emptycache - 它會刪除所有的蛋糕的緩存文件。

+0

嗯,我運行到哪裏修改表,然後將數據都在同一個呼叫的問題(從shell中運行)和'clearCache(NULL,「模型」);'似乎並不奏效(蛋糕被剝在將查詢發送到mysql之前的新列)。該修復可能會將其分成兩個來自外殼的調用,所以在第二次運行時更新緩存。 (Cake 1.3) – JoshStrange 2015-02-10 22:07:09

1

我發現妙解here。我認爲它應該是完美的,工作正常。像下面的解決方案:

function _clear_cache() 
    { 

     Cache::clear(); 
     clearCache(); 

     $files = array(); 
     $files = array_merge($files, glob(CACHE . '*')); // remove cached css 
     $files = array_merge($files, glob(CACHE . 'css' . DS . '*')); // remove cached css 
     $files = array_merge($files, glob(CACHE . 'js' . DS . '*')); // remove cached js 
     $files = array_merge($files, glob(CACHE . 'models' . DS . '*')); // remove cached models 
     $files = array_merge($files, glob(CACHE . 'persistent' . DS . '*')); // remove cached persistent 

     foreach ($files as $f) { 
      if (is_file($f)) { 
       try { 
        @unlink($f); 
       } catch (Exception $ex) { 
        $files['errors'][] = $ex->getMessage(); 
       } 
      } 
     } 

     if (function_exists('apc_clear_cache')): 
      apc_clear_cache(); 
      apc_clear_cache('user'); 
     endif; 

     return $files; 

    } 

AppController的只需使用上述功能,並運行你希望它會清除所有緩存功能。

相關問題