Решил попробовать кэширование страниц, делаю по руководству:
В конфиге:
'cache'=>array(
'class' => 'CFileCache',
),
В контроллере:
public function filters() {
return array(
'accessControl',
array(
'COutputCache',
'duration'=>3600,
),
);
}
Однако кэш-файл пересоздается всякий раз. Стал разбираться и выяснилось, что для файлового кэша условием его актуальности будет ($time=@filemtime($cacheFile))>time() (функция getValue в CFileCache.php), т.е. файл должен создаваться со временем модификации = текущее время + время жизни кэша. Для кэша структур таблиц БД в этом же проекте это так и есть, а в случае кэширования страниц с COutputCache - время изменения файла равно времени его создания, т.о. кэш устаревает сразу после создания.
Коллеги, не дайте погибнуть, уже всю голову сломал. У кого-нибудь работает кэширование страниц (связка COutputCache и CFileCache)?
Сейчас проверил кэширование данных (Yii::app()->cache->set/get) - такая же история, файл кэша создается со временем модификации, равным текущему времени, и потому кэш сразу устаревает. Получается, проблема с CFileCache. Может настройки в конфиге нужны дополнительные? Но структура-то БД кэшируется нормально. Или проблема может быть в том, что гоняю сайт под Денвером в Win7?
По этому условию получаю неравенство 53167 != 35807 и последующие проблемы.
53167 - точный размер сохраненного файла с кэшем. Страница в utf-8, соответствующие php-переменные в .htaccess настроены, строковые функции преобразуются в многобайтные по дефолту, mb_strlen($value, ‘UTF-8’) дает то же число 35807.
Прошу помощи. Не знаю, в какую сторону дальше рыть.
Update: да, если подставить mb_strlen($value, ‘latin1’), то получаю верное число, т.е. считаются байты, а не символы. Что посоветуете? Отключить автопреобразование функций в многобайтные? Насколько корректно остальной код фреймворка будет работать с utf в этом случае?