Как Формируется Название Кеша

всем привет

вот какой вопрос: не могу взять в толк - как формируется название кеш-файла страницы…

я кеширую целиком страницу используя ‘varyByRoute’=>true с помощью фильтра в контроллере

то есть кеширую на основании пути, в который, по описанию входит id контроллера и экшена

мой путь http://site.ru/company/

то есть контроллер = Company, а экшен = Index

название кеша = 149db47fd7a855cc11ec12dc9adcff51

каким образом из companyindex получается 149db47fd7a855cc11ec12dc9adcff51

ведь SELECT md5(‘companyindex’) выдает 0ce3178e6e6eb81fd7b0a44dba46aec6

ай нид ё хэлп гайз!

p.s. мне это надо, чтобы вычислять какие роуты закешированы а какие нет

Дык взял АПИ референс да посмотрел.

Вот оно, вроде.

Судя по всему, по умолчанию application id прилепляется в начало.

смотрел - да видно не туда…

а как получить application id?

получил application id: Yii::app()->id; // b29d4a82

но всеравно это лажа,

так как SELECT md5(‘b29d4a82companyindex’) = 76ce43c477e36acdb03943f32ca8c5c0

а должно быть 149db47fd7a855cc11ec12dc9adcff51

А я ссылку неверную дал :)

http://www.yiiframework.com/doc/api/1.1/COutputCache#getCacheKey-detail

То есть что-то типа


$key=$this->getBaseCacheKey().'.';

$controller=$this->getController();

$key.=$controller->getUniqueId().'/';

if(($action=$controller->getAction())!==null)

    $key.=$action->getId();

}

$key.='.';

...

$key.='.';



Во как.

Иными словами, забудьте про ручное формирование ключа, это будет тоталли анрелайабл, так сказать.

Чуток сменят алгоритм - и хана.

Дергайте сразу метод класса, пусть он значение формирует.

нифига не понял…

заюзал так =


$obj = new COutputCache();

echo $obj->cacheKey;

получил = Yii.COutputCache.yw0…company/index…

но SELECT md5(‘Yii.COutputCache.yw0…company/index…’)

выдает 4fd7cd1425951d277d0d9a3e94d47752

все равно не то

может есть билд-ин возможность проверки кэша?

checkCache(‘company/index’)

Ну, вообще вот и вот, только надо сообразить, как до него добраться. Надо АПИ покопать, где там кеш-компонент хранится при запросе.

все оказалось несложно, но работает только на кешировании фрагментов:

  1. создаем дочерний класс MyCFileCache от CFileCache с одной переменной и одним методом

  2. прописываем к нему путь в конфиге = ‘class’=>‘application.components.MyCFileCache’

  3. в классе MyCFileCache создаем новую публичную переменную public $my_pref = "";

  4. немного дорабатываем getCacheFile

  5. в экшене где кешируем фрагмент формируем свой префикс: Yii::app()->cache->my_pref = Yii::app()->controller->id."".Yii::app()->controller->action->id."";

общий вид класса MyCFileCache:


class MyCFileCache extends CFileCache

{

    public $my_pref = "";


    protected function getCacheFile($key)

    {

        if($this->directoryLevel>0)

        {

            $base=$this->cachePath;

            for($i=0;$i<$this->directoryLevel;++$i)

            {

                if(($prefix=substr($key,$i+$i,2))!==false)

                        $base.=DIRECTORY_SEPARATOR.$prefix;

            }

            return $base.DIRECTORY_SEPARATOR.

						$this->my_pref.$key.$this->cacheFileSuffix;

        }

        else

            return $this->cachePath.DIRECTORY_SEPARATOR

						.$this->my_pref.$key.$this->cacheFileSuffix;

    }

}

в пресдтавленни, естественно, это =


<?php if($this->beginCache('cacheName')) { ?>

…кэшируемое содержимое…

<?php $this->endCache(); } ?>

все!

теперь название кеша будет такое = controller_action_id_63032cbbacd93ec6f6b6550eef64bb25.html