styleroom
(Styleroom)
January 23, 2014, 10:06am
1
всем привет
вот какой вопрос: не могу взять в толк - как формируется название кеш-файла страницы…
я кеширую целиком страницу используя ‘varyByRoute’=>true с помощью фильтра в контроллере
то есть кеширую на основании пути, в который, по описанию входит id контроллера и экшена
мой путь http://site.ru/company/
то есть контроллер = Company, а экшен = Index
название кеша = 149db47fd7a855cc11ec12dc9adcff51
каким образом из companyindex получается 149db47fd7a855cc11ec12dc9adcff51
ведь SELECT md5(‘companyindex’) выдает 0ce3178e6e6eb81fd7b0a44dba46aec6
ай нид ё хэлп гайз!
p.s. мне это надо, чтобы вычислять какие роуты закешированы а какие нет
Дык взял АПИ референс да посмотрел.
Вот оно, вроде.
Судя по всему, по умолчанию application id прилепляется в начало.
styleroom
(Styleroom)
January 23, 2014, 10:12am
3
Дык взял АПИ референс да посмотрел.
Вот оно, вроде.
Судя по всему, по умолчанию application id прилепляется в начало.
смотрел - да видно не туда…
а как получить application id?
styleroom
(Styleroom)
January 23, 2014, 10:17am
4
получил 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.='.';
Во как.
Иными словами, забудьте про ручное формирование ключа, это будет тоталли анрелайабл , так сказать.
Чуток сменят алгоритм - и хана.
Дергайте сразу метод класса, пусть он значение формирует.
styleroom
(Styleroom)
January 23, 2014, 10:49am
7
Иными словами, забудьте про ручное формирование ключа, это будет тоталли анрелайабл , так сказать.
Чуток сменят алгоритм - и хана.
Дергайте сразу метод класса, пусть он значение формирует.
нифига не понял…
заюзал так =
$obj = new COutputCache();
echo $obj->cacheKey;
получил = Yii.COutputCache.yw0…company/index…
но SELECT md5(‘Yii.COutputCache.yw0…company/index…’)
выдает 4fd7cd1425951d277d0d9a3e94d47752
все равно не то
может есть билд-ин возможность проверки кэша?
checkCache(‘company/index’)
Ну, вообще вот и вот, только надо сообразить, как до него добраться. Надо АПИ покопать, где там кеш-компонент хранится при запросе.
styleroom
(Styleroom)
November 30, 2014, 9:27am
9
Ну, вообще вот и вот, только надо сообразить, как до него добраться. Надо АПИ покопать, где там кеш-компонент хранится при запросе.
все оказалось несложно, но работает только на кешировании фрагментов:
создаем дочерний класс MyCFileCache от CFileCache с одной переменной и одним методом
прописываем к нему путь в конфиге = ‘class’=>‘application.components.MyCFileCache’
в классе MyCFileCache создаем новую публичную переменную public $my_pref = "";
немного дорабатываем getCacheFile
в экшене где кешируем фрагмент формируем свой префикс: 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