• ПлагиныBackend
  • Quicksilver – система кэширования страниц в статичные файлы.

  • Изменено

Страница плагина Quicksilver в маркетплейсе OctoberCMS.

О плагине:

Молниеносно-быстрый статичный кэш для вашего сайта, который сохранят страницы как статичные .html, .xml, .json и другие файлы. Плагин будет полезен тем, кто хочет достичь максимальной скорости TTFB от своего сайта, снизить нагрузку на сервер, и повысить привлекательность своего сайта для поисковых роботов.

Багрепорты и PR принимаются только в официальном репозитории плагина по ссылке: https://gitlab.biz-mark.ru/free-plugins/Quicksilver/-/issues

Обсуждения или предложения новых идей принимаются как в официальном репозитории так и на этой странице.

Установка

php artisan plugin:install Biz-Mark.Quicksilver

Опциональная настройка

  1. Откройте .htaccess в корне вашего проекта и добавьте следующие директивы:
    Перед секцией Standard routes

    ##
    ## Serve Cached Page If Available
    ##
    RewriteCond %{QUERY_STRING} ^(.)
    RewriteRule !^index.php index.php [L,NC]
    RewriteCond %{REQUEST_URI} ^/?$
    RewriteCond %{DOCUMENT_ROOT}/storage/quicksilver/cache/qs_index_qs.html -f
    RewriteRule .? /storage/quicksilver/cache/qs_index_qs.html [L]
    RewriteCond %{DOCUMENT_ROOT}/storage/quicksilver/cache%{REQUEST_URI}.html -f
    RewriteRule . /storage/quicksilver/cache%{REQUEST_URI}.html [L]
    RewriteCond %{HTTP:X-Requested-With} XMLHttpRequest
    RewriteRule !^index.php index.php [L,NC]
  2. Закоментируйте следующую строку в секции White listed folders.

        RewriteRule !^index.php index.php [L,NC]
  3. Убедитесь что у CMS есть доступ на чтение/запись/удаление папки /storage/quicksilver/cache

Игнорирование кэша для GIT

Не забудьте добавить в свой .gitignore следующее условие:

/storage/quicksilver/cache

Очистка кэша

Так как кэш сохраняется в виде статичных файлов в файловую систему, при любом изменении исходных данных, вам необходимо чистить этот кэш чтобы изменения были записаны в кэш заново. Для сброса кэша вы можете воспользоваться Виджетом для Дашборда который добавляется нажатием на кнопку “добавить виджет”, или можете выполнить artisan команду в консоли вашего сервера:

php artisan quicksilver:clear

Как дополнительно, можете написать небольшой скрипт для деплоя, который будет чистить кэш страниц при каждом деплое.

Опционально: вы можете удалить кэш определенной страницы, просто добавив к предыдущей команде в консоли ссылку.

php artisan quicksilver:clear {slug}


© 2022, Никита Хаецкий, Biz-Mark под лицензией GNU General Public License v2.0.

  • Koresh ответили на это сообщение.
    6 месяцев спустя

    Плагин супер. Круть.

    Но чтобы всё было как в сказке, нужно немного подработать систему под него.
    Мне вот не совсем понятно по middleware, поэтому есть вопрос.

    Вот мы создали по инструкции плагин с моделями Categoty и Item. В обоих этих моделях у меня есть поле published (опубликовано). Как сделать чтобы если неопубликовано, то чтобы страница не кешировалась? Это можно сделать из компонента?

    Вот есть:

    public function onRun() {
            $item = Item::where('slug', $this->property('slugItem'))->first();
    
            if ( empty($item) ) {
                return $this->controller->run('404');
            }
            
            $this->page['item'] = $item;
    
            if ( $item->published != 1 ) {
                $this->page['nopublic'] = true;
            }
     }

    Здесь нельзя задать чтобы кешировало то что опубликовано?

    Или только новым плагином делать?

    • reazzon ответили на это сообщение.

      Koresh Как сделать чтобы если неопубликовано, то чтобы страница не кешировалась? Это можно сделать из компонента?

      Вам нужно отдавать 404 статус ответа страницы чтобы она не кешировалась. Да и вообще страница не должна вообще открываться если ее запись не опубликована

      • Koresh ответили на это сообщение.

        reazzon Я как админ авторизированный в бекенде могу просматривать неопубликованные айтемы на фронте.
        У меня в коде ещё есть вот такая проверка:

        if (\BackendAuth::check()) {
            $this->page['admin'] = true;
            $admin = true;
        }

        И уже в .htm твигами прописана логика что админ может просматривать неопубликованные записи. Удобно, во время создания записи в беке можно смотреть что получается на фронте.
        Из первого комента этот кусок убрал чтобы не растягивать.

        • reazzon ответили на это сообщение.

          reazzon А я правильно понял что php-код плагина реализует создание и чистку кеш страниц, а вся логика по выводу страницы прописана в .htaccess?

          Тогда может можно в .htaccess добавить проверку на айпишник посетителя? Если это мой айпи то выводить некешированные страницы, для всех остальных - выводить по существующей логике. Так можно сделать?

          • reazzon ответили на это сообщение.

            Koresh Все верно, логика отображения кеша задается в .htaccess как его сконфигурировать как ты хочешь - не знаю. Тут надо гуглить.

            Koresh Я как админ авторизированный в бекенде могу просматривать неопубликованные айтемы на фронте.

            По твоему сниппету кода функции onRun() я вижу что ты отдаешь 404 код страницы только если у тебя не найдется запись. То-есть если зайдет человек на опубликованную статью ему не отдастся 404 статус

            • Koresh ответили на это сообщение.

              reazzon отдаешь 404 код страницы только если

              У меня всё норм, просто я укоротил код, чтобы оставить только то что по теме. Но спасибо за подсказку.

              reazzon не конфликтует с URL которые содержат в себе параметры в виде ?q=123

              Не знаю известно ли, перечитал вроде не упоминается, с пагинацией проблемы в таких урлах. Выводит одну страницу.
              Как заметил - пришлось отключить плагин. Жаль. Может найдётся какое решение. Плаг реально скорость сайта увеличивает.

              5 дней спустя

              Классный плагин, единственный в своем роде, спасибо Автору.
              У меня такой вопрос, плагин поставил на чистый October, все сделал по инструкции. Внес изменения в .htaccess и после очистки кеша браузера сломалась админка сайта. При этом на фронте сайт работает. Я решил попробовать закоментировать строку RewriteRule !index.php index.php [L,NC] в секции ## Block all PHP files, except index и все заработало. Плагин функционирует отлично, страницы кеширует, через виджет кеш чистится. В чем может быть проблема? Я не уверен что это правильный способ решения.

              • reazzon ответили на это сообщение.

                Stas-Bel сломалась админка сайта.

                Можно подробнее, как сломалась? Что вы видите у себя на экране?

                Так выглядить страница входа и админки сайта. Сайт стоит локально на Open Server.

                Прикладываю код .htaccess

                <IfModule mod_rewrite.c>
                
                    <IfModule mod_negotiation.c>
                        Options -MultiViews
                    </IfModule>
                
                    RewriteEngine On
                
                    ##
                    ## You may need to uncomment the following line for some hosting environments,
                    ## if you have installed to a subdirectory, enter the name here also.
                    ##
                    # RewriteBase /
                
                    ##
                    ## Uncomment following lines to force HTTPS.
                    ##
                    # RewriteCond %{HTTPS} off
                    # RewriteRule (.*) https://%{SERVER_NAME}/$1 [R,L]
                
                    ##
                    ## Black listed folders
                    ##
                    RewriteRule ^bootstrap/.* index.php [L,NC]
                    RewriteRule ^config/.* index.php [L,NC]
                    RewriteRule ^vendor/.* index.php [L,NC]
                    RewriteRule ^storage/cms/.* index.php [L,NC]
                    RewriteRule ^storage/logs/.* index.php [L,NC]
                    RewriteRule ^storage/framework/.* index.php [L,NC]
                    RewriteRule ^storage/temp/protected/.* index.php [L,NC]
                    RewriteRule ^storage/app/uploads/protected/.* index.php [L,NC]
                
                    ##
                    ## White listed folders
                    ##
                    RewriteCond %{REQUEST_FILENAME} -f
                    RewriteCond %{REQUEST_FILENAME} !/.well-known/*
                    RewriteCond %{REQUEST_FILENAME} !/storage/app/uploads/.*
                    RewriteCond %{REQUEST_FILENAME} !/storage/app/media/.*
                    RewriteCond %{REQUEST_FILENAME} !/storage/temp/public/.*
                    RewriteCond %{REQUEST_FILENAME} !/themes/.*/(assets|resources)/.*
                    RewriteCond %{REQUEST_FILENAME} !/plugins/.*/(assets|resources)/.*
                    RewriteCond %{REQUEST_FILENAME} !/modules/.*/(assets|resources)/.*
                    ##RewriteRule !^index.php index.php [L,NC]
                
                    ##
                    ## Block all PHP files, except index
                    ##
                    RewriteCond %{REQUEST_FILENAME} -f
                    RewriteCond %{REQUEST_FILENAME} \.php$
                    RewriteRule !^index.php index.php [L,NC]
                
                    ##
                    ## Serve Cached Page If Available
                    ##
                    RewriteCond %{QUERY_STRING} ^(.)
                    RewriteRule !^index.php index.php [L,NC]
                    RewriteCond %{REQUEST_URI} ^/?$
                    RewriteCond %{DOCUMENT_ROOT}/storage/page-cache/pc__index__pc.html -f
                    RewriteRule .? /storage/page-cache/pc__index__pc.html [L]
                    RewriteCond %{DOCUMENT_ROOT}/storage/page-cache%{REQUEST_URI}.html -f
                    RewriteRule . /storage/page-cache%{REQUEST_URI}.html [L]
                    RewriteCond %{HTTP:X-Requested-With} XMLHttpRequest
                    RewriteRule !^index.php index.php [L,NC]
                
                    ##
                    ## Standard routes
                    ##
                    RewriteCond %{REQUEST_FILENAME} !-f
                    RewriteRule ^ index.php [L]
                
                </IfModule>
                • reazzon ответили на это сообщение.

                  Если закоментировать 3ю строку в секции Block all PHP files, except index
                  или поставить ваш код .htaccess перед ней, все работает

                  Stas-Bel Очень странно, а можете показать консоль браузера, и какие там ошибки присуствуют?

                  Скрины консоли


                  [upl-image-preview url=//i.imgur.com/5nrl8b6.pn

                  11 дней спустя

                  Подскажите код для nginx

                  • reazzon ответили на это сообщение.

                    superoleg

                    location = / {
                        try_files /page-cache/pc__index__pc.html /index.php?$query_string;
                    }
                    
                    location / {
                        try_files $uri $uri/ /page-cache/$uri.html /index.php?$query_string;
                    }
                    • superoleg ответили на это сообщение.
                      4 месяца спустя

                      reazzon

                      в тот раз так и не получилось) Сейчас удалось достать из кэша только главную страницу
                      Покажите, пожалуйста, на примере моей конфигурации, как нужно доставать из кэша другие страницы

                      location = / {
                          try_files $uri /storage/page-cache/pc__index__pc.html /index.php?$query_string;
                      }
                      
                      location / {
                         # Let OctoberCMS handle everything by default.
                          # The path not resolved by OctoberCMS router will return OctoberCMS's 404 page.
                          # Everything that does not match with the whitelist below will fall into this.
                          rewrite ^/.*$ /index.php last;
                      	location ~ [^/]\.ph(p\d*|tml)$ {
                      		try_files /does_not_exists @php;
                      	}
                      	
                      }
                       # Pass the PHP scripts to FastCGI server
                      location ~ ^/index.php {
                          # Write your FPM configuration here
                      
                      }
                      
                      # Whitelist
                      ## Let October handle if static file not exists
                      location ~ ^/favicon\.ico { try_files $uri /index.php; }
                      location ~ ^/sitemap\.xml { try_files $uri /index.php; }
                      location ~ ^/robots\.txt { try_files $uri /index.php; }
                      location ~ ^/humans\.txt { try_files $uri /index.php; }
                      
                      ## Let nginx return 404 if static file not exists
                      location ~ ^/storage/app/uploads/public { try_files $uri 404; }
                      location ~ ^/storage/app/media { try_files $uri 404; }
                      location ~ ^/storage/temp/public { try_files $uri 404; }
                      
                      location ~ ^/modules/.*/assets { try_files $uri 404; }
                      location ~ ^/modules/.*/resources { try_files $uri 404; }
                      location ~ ^/modules/.*/behaviors/.*/assets { try_files $uri 404; }
                      location ~ ^/modules/.*/behaviors/.*/resources { try_files $uri 404; }
                      location ~ ^/modules/.*/widgets/.*/assets { try_files $uri 404; }
                      location ~ ^/modules/.*/widgets/.*/resources { try_files $uri 404; }
                      location ~ ^/modules/.*/formwidgets/.*/assets { try_files $uri 404; }
                      location ~ ^/modules/.*/formwidgets/.*/resources { try_files $uri 404; }
                      location ~ ^/modules/.*/reportwidgets/.*/assets { try_files $uri 404; }
                      location ~ ^/modules/.*/reportwidgets/.*/resources { try_files $uri 404; }
                      
                      location ~ ^/plugins/.*/.*/assets { try_files $uri 404; }
                      location ~ ^/plugins/.*/.*/resources { try_files $uri 404; }
                      location ~ ^/plugins/.*/.*/behaviors/.*/assets { try_files $uri 404; }
                      location ~ ^/plugins/.*/.*/behaviors/.*/resources { try_files $uri 404; }
                      location ~ ^/plugins/.*/.*/reportwidgets/.*/assets { try_files $uri 404; }
                      location ~ ^/plugins/.*/.*/reportwidgets/.*/resources { try_files $uri 404; }
                      location ~ ^/plugins/.*/.*/formwidgets/.*/assets { try_files $uri 404; }
                      location ~ ^/plugins/.*/.*/formwidgets/.*/resources { try_files $uri 404; }
                      location ~ ^/plugins/.*/.*/widgets/.*/assets { try_files $uri 404; }
                      location ~ ^/plugins/.*/.*/widgets/.*/resources { try_files $uri 404; }
                      
                      location ~ ^/themes/.*/assets { try_files $uri 404; }
                      location ~ ^/themes/.*/resources { try_files $uri 404; }
                      • reazzon ответили на это сообщение.

                        superoleg Для Nginx юзай следующий конфиг

                        location = / {
                            try_files /page-cache/pc__index__pc.html /index.php?$query_string;
                        }
                        
                        location / {
                            try_files $uri $uri/ /page-cache/$uri.html /page-cache/$uri.json /index.php?$query_string;
                        }
                        • superoleg ответили на это сообщение.

                          reazzon а можно полный location / {} ?
                          ибо все равно не получается из кэша брать и одновременно, если нет в кэше, чтобы запускало index.php

                          Так и знал, что где-то опечатка у тебя) Пришлось поизучать nginx, повысить свой уровень от нуля до стремится к нулю =)

                          location = / {
                              try_files $uri /storage/page-cache/pc__index__pc.html /index.php?$query_string;
                          }
                          
                          location / {
                          
                             
                              # Let OctoberCMS handle everything by default.
                              # The path not resolved by OctoberCMS router will return OctoberCMS's 404 page.
                              # Everything that does not match with the whitelist below will fall into this.
                           
                              try_files /storage/page-cache$uri.html /index.php?$query_string;
                          
                          	
                          }
                          
                          # Pass the PHP scripts to FastCGI server
                          location ~ ^/index.php {
                              # Write your FPM configuration here
                              rewrite ^/.*$ /index.php last;
                              location ~ [^/]\.ph(p\d*|tml)$ {
                          		try_files /does_not_exists @php;
                          	}
                             
                          }
                          
                          # Whitelist
                          ## Let October handle if static file not exists
                          location ~ ^/favicon\.ico { try_files $uri /index.php; }
                          location ~ ^/sitemap\.xml { try_files $uri /index.php; }
                          location ~ ^/robots\.txt { try_files $uri /index.php; }
                          location ~ ^/humans\.txt { try_files $uri /index.php; }
                          
                          ## Let nginx return 404 if static file not exists
                          location ~ ^/storage/app/uploads/public { try_files $uri 404; }
                          location ~ ^/storage/app/media { try_files $uri 404; }
                          location ~ ^/storage/temp/public { try_files $uri 404; }
                          
                          location ~ ^/modules/.*/assets { try_files $uri 404; }
                          location ~ ^/modules/.*/resources { try_files $uri 404; }
                          location ~ ^/modules/.*/behaviors/.*/assets { try_files $uri 404; }
                          location ~ ^/modules/.*/behaviors/.*/resources { try_files $uri 404; }
                          location ~ ^/modules/.*/widgets/.*/assets { try_files $uri 404; }
                          location ~ ^/modules/.*/widgets/.*/resources { try_files $uri 404; }
                          location ~ ^/modules/.*/formwidgets/.*/assets { try_files $uri 404; }
                          location ~ ^/modules/.*/formwidgets/.*/resources { try_files $uri 404; }
                          location ~ ^/modules/.*/reportwidgets/.*/assets { try_files $uri 404; }
                          location ~ ^/modules/.*/reportwidgets/.*/resources { try_files $uri 404; }
                          
                          location ~ ^/plugins/.*/.*/assets { try_files $uri 404; }
                          location ~ ^/plugins/.*/.*/resources { try_files $uri 404; }
                          location ~ ^/plugins/.*/.*/behaviors/.*/assets { try_files $uri 404; }
                          location ~ ^/plugins/.*/.*/behaviors/.*/resources { try_files $uri 404; }
                          location ~ ^/plugins/.*/.*/reportwidgets/.*/assets { try_files $uri 404; }
                          location ~ ^/plugins/.*/.*/reportwidgets/.*/resources { try_files $uri 404; }
                          location ~ ^/plugins/.*/.*/formwidgets/.*/assets { try_files $uri 404; }
                          location ~ ^/plugins/.*/.*/formwidgets/.*/resources { try_files $uri 404; }
                          location ~ ^/plugins/.*/.*/widgets/.*/assets { try_files $uri 404; }
                          location ~ ^/plugins/.*/.*/widgets/.*/resources { try_files $uri 404; }
                          
                          location ~ ^/themes/.*/assets { try_files $uri 404; }
                          location ~ ^/themes/.*/resources { try_files $uri 404; }
                          • reazzon ответили на это сообщение.

                            superoleg Так и знал, что где-то опечатка у тебя

                            Конфиг взял из документации к оригинальному пакету ларавеля, поэтому не мое)))