Подтвердить что ты не робот

Cakephp - почему некоторые изменения НЕ происходят, пока я не переключу отладку на 3?

Когда-нибудь я буду реализовывать изменения локально, и они работают нормально, я копирую их на удаленный веб-сервер, а измененные игнорируются. (Код идентичен.)

Я перехожу в core.php, меняю отладку на 3, снова проверяю... он работает!

У меня есть ощущение, что это связано с кешем, но я не знаю, что именно изменить.

4b9b3361

Ответ 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;

    }

Просто используйте вышеприведенную функцию в приложении и запустите эту функцию, где вы хотите, чтобы она была очищена от всего кеша.