有時我會在本地實施更改,並且它們工作正常,我將它們複製到我的遠程網絡服務器,並且更改將被忽略。 (代碼是相同的。)cakephp - 爲什麼一些更改不會發生,直到我將調試切換到3?
我進入core.php,將調試更改爲3,再次檢查...它的工作原理!
我有一種感覺,這是與緩存有關,但我不知道究竟要改變什麼。
有時我會在本地實施更改,並且它們工作正常,我將它們複製到我的遠程網絡服務器,並且更改將被忽略。 (代碼是相同的。)cakephp - 爲什麼一些更改不會發生,直到我將調試切換到3?
我進入core.php,將調試更改爲3,再次檢查...它的工作原理!
我有一種感覺,這是與緩存有關,但我不知道究竟要改變什麼。
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 plugins,Capistrano configs,Ant文件 - 但也可以手動執行此操作。
非常好的答案,非常感謝。 – Owen 2010-06-25 13:52:07
耶,設置'配置::寫(「Cache.disable」,真);'是沒有緩存有用。 – 2014-03-26 15:19:44
我認爲這是客戶端問題。你有安裝Firefox Mozilla的Web Developer addon嗎?如果是的話,你可以輕鬆地停用客戶端的緩存來檢查。
如果您更改調試級別,它會再次運行,因爲那麼url和cookie數據可能會略有不同,從而導致服務器重新加載。如果它仍然不起作用,那麼它一定是服務器端緩存...
注意:除此之外,你可以做所有類型的有用的東西,用於web開發與該插件如動態修改css或可視化樣式疊加在頁面上。
感謝Web Developer插件提示。我認爲我已經通過將Cache :: config('default',array('engine'=>'File','duration'=> 0))來禁用緩存。在core.php - 我想我做錯了? – Owen 2010-06-24 17:30:25
這絕對是緩存。在服務器端,如果您啓用了緩存,請不要懷疑緩存是否會發生。您可以在core.php中關閉此功能,或者更有可能在升級應用時清除緩存Cache::clear()
。在客戶端,您可能需要調整瀏覽器以完全禁用緩存。
我有同樣的問題,並deizel,給了一個很好的解釋,只是想補充,如果你不做很多的改變,簡單的方法,而不刪除或刪除緩存數據,或這樣的,是調試級別從0更改爲3,刷新網頁,您所做的重新設置調試上PO文件的變化,以及0
您可能會發現在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 - 它會刪除所有的蛋糕的緩存文件。
嗯,我運行到哪裏修改表,然後將數據都在同一個呼叫的問題(從shell中運行)和'clearCache(NULL,「模型」);'似乎並不奏效(蛋糕被剝在將查詢發送到mysql之前的新列)。該修復可能會將其分成兩個來自外殼的調用,所以在第二次運行時更新緩存。 (Cake 1.3) – JoshStrange 2015-02-10 22:07:09
我發現妙解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的只需使用上述功能,並運行你希望它會清除所有緩存功能。
類似:http://stackoverflow.com/questions/14716004/cakephp-database-table-missing-datasource-default – trante 2014-12-10 19:13:31