Пример использования кеширования в Yii2

Спонтанный вебинар о применении кеширования данных, фрагментов и страниц в Yii2 на примере каталога с прошлого скринкаста. Рассмотрели несколько вариантов и ответили на интересные вопросы зрителей:

Открыть на YouTube

Приглашаю на следующие видеоуроки. Анонс и ссылку на эфир, как обычно, пришлю в отдельной рассылке по вебинарам:

И задавайте вопросы в комментариях. Спасибо заранее!

Другие статьи

В очередном обсуждении архитектуры и DDD на форуме Yii (да, такое бывает, но жуткий дефицит) возник вопрос по упрощённому фрагменту сущности User из демо-приложения. Попробуем поразмышлять об архитектуре методов и о доменных моделях в Yii2.

С первого интенсива по ООП прошло уже полтора месяца. Надеюсь, что его участники уже несколько раз пересмотрели запись и многое попробовали в своих проектах. Так что пора двигаться дальше. На первом интенсиве это оказалось не так страшно. как многим казалось. Пришло время подвести итоги и сформировать планы на будущее.

При входе в чужой проект (или при доработке своего старого) часто сталкиваемся с отсутствием хоть каких-то автоматических тестов. А без них весьма неприятно ковыряться в исходниках, так как есть постоянный страх что-то сломать. Поэтому первым делом приходится внедрять автотесты. Посмотрим, чем Gii может нам помочь.

Многие через обратную связь просят их обучить какому-нибудь фреймворку, мотивируя это тем, что хотят перейти на новый уровень разработки. Но после собеседования часто оказывается, что они работали только с самописным кодом или с процедурными CMS, где толком не встречались с объектно-ориентированным подходом.

Комментарии

 

Дмитрий Елисеев

C renderDynamic это, вроде, не баг.

Ответить

 

Александр

А что это, если оно не работает?

Ответить

 

Юрий

Спасибо...
за проделанную работу..
жаль что всю инфу что ты даешь сразу не получается усвоить..)))

Ответить

 

Олег

Очень круто, мне до такого гениального кода еще далеко. Спасибо.

Ответить

 

Денис

А можно что-нибудь приземленное изучать, типа вывода иерархического меню или использования kartik yii2-grid c экспортом в эксель) Это конечно очень круто кеширование, когда в основном у тебя посещаемость максимум 20 человек в день)

Ответить

 

Дмитрий Елисеев

Здесь мы иерархическое меню для категорий и сделали. А с kartik - устанавливаем и делаем по инструкции.

Ответить

 

Денис

Еще из насущных проблем: как зафигачить jabber чат на сайт, с обновлением естественно в реальном времени. Ну и про панель с правой стороны на yii2 заодно расскажите)

Ответить

 

Дмитрий Елисеев

Для jabber интегрируем что-нибудь вроде этого. А панель мы и сделали с виджетами категорий и меток в каталоге.

Ответить

 

Денис

Доброго времени суток, Дмитрий! Научите, пожалуйста делать свои шаблоны для генеоации CRUD правильно. Чем больше хороших и коротких уроков типа рецептов по Yii у вас будет, тем больше будет посещаемость. Длинные видеоуроки очень тяжело смотреть. А что-то по-быстрому найти- вообще нереально у вас в видео).
Я конечно не достоин кого-то учить. Но это так, мое небольшое замечание и просьба)

Ответить

 

Дмитрий Елисеев

Про CRUD уже есть.

Ответить

 

Вадим

Честно говоря, вообще не знаком с Yii2, однако все чаще встречаю упоминаю о нем. Видимо идет динамика роста популярности, надо проверить статистическую информацию.
Вообще интересная, конечно, тема. В свободное время надо заняться изучением. Думаю, все получится, ведь познания в программирования на языках вроде html, php, c++ и некоторых других имеются.

Ответить

 

Дмитрий

Привет. Мне не совсем понятно о каком гигабайте памяти идет речь начиная с 2:31:40 (http cache) и почему нужно быть осторожным с user id . Там ведь речь об http cache. То есть, в зависимости от нашего заголовка (etag или last modified) все кэшируется в браузере у клиента. Не понятно причем тут гигабайт памяти. Пожалуйста проясните эту ситуацию если я что-то не так понял.

Ответить

 

Дмитрий Елисеев

Нужно быть осторожным с user->id при обычном кеше.

Ответить

 

Дмитрий

И еще один вопрос про кэширование статики на отметке 2:57:30. Мне не совсем понятно зачем нужно специально что-то делать для инвалидирования статики (например использовать appendTimestamp в assetManager) . По-умолчанию, веб-сервер (nginx например) отдает статику с нормальными заголовками, то есть берет дату и время последнего изменения из статичного файла (js, css, jpg итд) и передает их в заголовок last modified. Таким образом, если мы изменяем статичный файл на сервере, то он и придет клиенту в браузер со статусом 200 и сразу закэшируется в браузере. В след. раз при обновлении страницы этот файл уже будет браться из кэша браузера (статус 304). Там правда есть нюанс с опцией nginx sendfile, если sendfile отключен то все работает как и должно без всяких добавлений таких параметров как ?v=... В итоге, мне не ясно зачем нужно что-то делать специально для кэширования статики если это в вебсервере все уже настроено и логично (на мой взгляд) работает.

Ответить

 

Дмитрий Елисеев

Если всё работает и браузер запрашивает с If-Modified-Since, то не нужно.

Ответить

 

Алина Есенина

Вопрос немного не по кэшированию, просто в своём видео вы затронули вопрос activateParents

    use yii\bootstrap\Nav;
    echo Nav::widget([
        'options' => ['class' => 'x-navigation x-navigation-custom'],
        'items' => array_filter([
            '<li class="xn-logo">
            <a href="/">' . Yii::t('app', 'App title') . '</a>
            <a href="#" class="x-navigation-control"></a>
        </li>',
            [
                'label' => Yii::$app->params['department']['icon'] . '<span class="xn-text">' . Yii::t('app', 'Departments') . '</span>',
                'url' => ['/department/default/index'],
            ]
        ]),
        'encodeLabels' => false,
        'activateParents'=>true,
    ]);

Как раз в своей системе никак не могу победить это баг. Т.е. если перехожу по url: site/department - то меню подсвечивается, как активное, а если site/department/1 то уже не подсвечивается

Работает через модули, как вы поняли

Ответить

 

Дмитрий Елисеев

Ну так у Вас вложенных подпунктов нет, чтобы срабатывало activateParents. Проставляйте активность вручную:

[
    'label' => Yii::t('app', 'Departments'),
    'url' => ['/department/default/index'],
    'active' => $this->contenxt->module->id == 'department',
]
Ответить

 

Алина Есенина

Дмитрий, спасибо большое.

Ответить

 

Темир

Добрый день, не получается настроить pagecache, есть экшн

public function actionViewService($slug)
{
    $model = Service::findOne(['slug' => $slug]);
    return $this->render('view_service', [
        'model' => $model
    ]);
}

пишу

public function behaviors()
{
    return [
        [
            'class' => 'yii\filters\PageCache',
            'only' => ['view-service'],
            'duration' => 9999, 
        ],
    ];
}

Так вот он кэширует только первую посещенную страницу с этого экшна, при переходе на другие показывает только эту первую закешированную.

Что нужно прописать чтобы остальные страницы с этого экшна тоже каэшировались и показывали свою страницу.

Ответить

 

Дмитрий Елисеев
'variations' => [Yii::$app->request->get('slug')],
Ответить

 

Темир

Дмитрий, спасибо за помощь, получилось:-)

Ответить

 

Павел

Подскажите, можно ли использовать pageCache в проекте интернет магазина? В частности где есть корзина, просмотренные товары и тд и тп. У меня при включении pageCache, кэшируется вся страница целиком и счетчики не обновляются в итоге(

Ответить

 

Дмитрий Елисеев

Только если виджеты со счётчиками не рендерить сразу в коде самой страницы, а подгружать по Ajax.

А так для динамических сайтов PageCache не очень полезен. Удобнее кешировать фрагментами.

Ответить

 

Павел

Фрагментарное настроено, но результат скорости загрузки главной хотелось бы видеть еще меньше.

С Ajax спасибо, хорошая подсказка, буду смотреть в эту сторону.

Ответить

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

Войти | Завести аккаунт


(никто не увидит)



Можно использовать теги <p> <ul> <li> <b> <i> <a> <pre>