Cakephp - почему некоторые изменения НЕ происходят, пока я не переключу отладку на 3?
Когда-нибудь я буду реализовывать изменения локально, и они работают нормально, я копирую их на удаленный веб-сервер, а измененные игнорируются. (Код идентичен.)
Я перехожу в core.php, меняю отладку на 3, снова проверяю... он работает!
У меня есть ощущение, что это связано с кешем, но я не знаю, что именно изменить.
Ответы
Ответ 1
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
.
Итак, просто укажите, что вы должны помнить, что удаляете все файлы в этих каталогах всякий раз, когда вы делаете изменения кода в приложении, которое находится в процессе производства, или добавляете это как часть вашего механизм развертывания. Вы не должны удалять любую из каталогов.
Причиной изменения отладки для 3-х работ является то, что когда режим отладки включается (при любом значении больше нуля), кеш очищается и регенерируется по каждому запросу, но - пока это работает - его непросто автоматизировать.
Существует несколько способов сделать это программно - в том числе команды оболочки, Плагины CakePHP, Capistrano configs, Ant файлы, но можно также просто сделать это вручную.
Ответ 2
Вы можете найти это полезным для очистки кеша в 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 - он удалит все кеш файлы Cake.
Ответ 3
Это определенно кеширование. На стороне сервера, если вы включили кеширование, не задайтесь вопросом, происходит ли кеширование. Вы можете отключить это в core.php или, скорее всего, очистить кеш Cache::clear()
при обновлении вашего приложения. На стороне клиента вы можете настроить свой браузер, чтобы полностью отключить кеширование.
Ответ 4
Я думаю, что это проблема на стороне клиента. У вас есть аддон веб-разработчика для Firefox Mozilla установлен? если да, вы можете легко деактивировать кеш на стороне клиента, чтобы проверить.
Он снова работает, если вы измените уровень отладки, потому что тогда данные URL-адресов и файлов cookie, вероятно, немного отличаются друг от друга, что приводит к новой перезагрузке с сервера. Если он все еще не работает, то он должен быть кешем на стороне сервера...
ПРИМЕЧАНИЕ. Помимо этого вы можете делать всевозможные полезные вещи для веб-разработки с помощью этого аддона, например, модифицировать CSS на лету или визуализировать стили как наложение на странице.
Ответ 5
У меня была одна и та же проблема, и deizel дал отличный объяснение, просто хотел добавить, если вы не внесете много изменений, простой способ, не удаляя или удаляя данные кэша, или что-то вроде этого, изменить уровень отладки от 0 до 3, обновить страницы (ы), внести изменения в файл po и снова установить debug на 0.
Ответ 6
Я нашел замечательное решение здесь. Я думаю, что это должно быть прекрасно и прекрасно работать. Решение, как показано ниже:
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;
}
Просто используйте вышеприведенную функцию в приложении и запустите эту функцию, где вы хотите, чтобы она была очищена от всего кеша.