cakephp - почему некоторые изменения НЕ происходят, пока я не переключу отладку на 3? - PullRequest
13 голосов
/ 24 июня 2010

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

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

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

Ответы [ 6 ]

30 голосов
/ 25 июня 2010

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 files.

Итак, проще говоря, вы должны помнить об удалении всех файлов в этих каталогах всякий раз, когда вы вносите изменения в код приложения, которое находится в разработке, или добавляете это как часть вашего механизм развертывания .Однако вы не должны удалять какие-либо из каталогов.

Причина, по которой изменение отладки на 3 работает для вас, заключается в том, что когда включен режим отладки (при любом значении, большем нуля), кэш очищаетсяи регенерируется при каждом запросе, но - пока это работает - автоматизировать нелегко.

Существует несколько способов сделать это программно, включая команды оболочки , CakePHPплагины , конфиги Capistrano , файлы Ant - но это можно сделать и вручную.

6 голосов
/ 02 мая 2013

Вы можете найти это полезным для очистки кэша в 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.

2 голосов
/ 24 июня 2010

Это определенно кеширование.На стороне сервера, если у вас включено кэширование, не задавайтесь вопросом, происходит ли кэширование.Вы можете отключить это в core.php или, более вероятно, очистить кэш Cache::clear() при обновлении приложения.На стороне клиента вы можете настроить браузер, чтобы полностью отключить кэширование.

1 голос
/ 09 декабря 2016

Я нашел замечательное решение здесь .Я думаю, что это должно быть идеально и работать нормально.Решение, как показано ниже:

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 и запустите эту функцию там, где вы хотите, чтобы очистить весь кэш.

1 голос
/ 05 декабря 2012

У меня была та же проблема, и Дейзел дал отличное объяснение, просто хотел добавить, если вы не вносите много изменений, простой способ, без удаления или удаления данных кэша или чего-то подобного, это чтобы изменить уровень отладки с 0 на 3, обновите страницу (ы), в которую вы вносите изменения в po-файле, и снова установите для отладки значение 0.

1 голос
/ 24 июня 2010

Я думаю, что это проблема на стороне клиента. У вас установлен аддон для веб-разработчиков для Firefox Mozilla? если да, вы можете легко деактивировать кеш на стороне клиента, просто чтобы проверить.

Это снова работает, если вы измените уровень отладки, потому что тогда URL и данные cookie, вероятно, немного отличаются, что приводит к новой перезагрузке с сервера. Если он все еще не работает, то это должен быть кэш на стороне сервера ...

ПРИМЕЧАНИЕ. Помимо этого, вы можете делать все виды полезных вещей для веб-разработки с помощью этого дополнения, например изменять CSS на лету или визуализировать стили в качестве наложения на страницу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...