понедельник, 16 февраля 2015 г.

Кеширование в Yii2

После того как поиграл с профайлером захотелось мне немного ускорить генерацию страниц в одном глупом проекте за счет кеширования.
1. Кеширование страницы целиком, реализуется через поведение контроллера
    public function behaviors()
    {
        return [
            [
                'class' => 'yii\filters\PageCache',
                'only' => ['index'],
                'duration' => 3600,
            ],
        ];
    }

тут я кеширую страницу index на один час

2. Кеширование блоков внутри шаблона страницы
<?php if ($this->beginCache('shop' . $shop->id, ['duration' => 3600])) : ?>
    .......

    <?php $this->endCache() ?>
<?php endif ?>
кешируется все что попало между beginCache & endCache



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

До изменений контроллер выглядел примерно так
public function actionShop($id)
{
        $shop = Shop::findOne($id);
        $products= Product::find()->where(['shop_id'=>$shop->id]) ->orderBy(['price'=>SORT_DESC])->all();
        return $this->render('pricelist', ['shop'=>$shop, 'products'=>$products];
}

Однако после того как я кеширование фрагмента - список товаров, пришлось перенести
        $products= Product::find()->where(['shop_id'=>$shop->id]) ->orderBy(['price'=>SORT_DESC])->all();
в модель Shop. Тут многие могут сказать, что так и надо было сделать изначально, но я не считаю нужным делать такие вещи пока проект активно меняется. Если бы я убрал это раньше я мог пропустить очевидность этих изменений.

Вообще все закончилось хорошо. Скорость отдачи увеличилась, спасибо Redis, а я получил прекрасный опыт, что:
1. преждевременная оптимизация - хуже отсутствия её вообще
2. кеширование нужно использовать с умом

Комментариев нет:

Отправить комментарий