Перейти к содержанию

Производительность и кэширование⚓︎

Одна из основных характеристик, которые делают Grav настолько привлекательным — это её скорость. Это всегда было ключевым моментом в конструкции Grav, и в первую очередь это связано с кэшированием, но включает несколько других компонентов.

Производительность⚓︎

  1. Кэширование PHP имеет решающее значение. Вы должны запустить PHP opcache и usercache, чтобы получить максимальную производительность от Grav. В PHP 5.5 и 5.6 Zend opcache с APCu user cache работает немного быстрее.
  2. SSD-накопители могут иметь большое значение. Большинство вещей можно кэшировать в пользовательском кэше PHP, но некоторые хранятся в виде файлов, поэтому SSD-диски могут сильно повлиять на производительность.
  3. Собственный хостинг всегда будет быстрее, чем виртуальная машина. Виртуальные машины — отличный способ, с помощью которого хостинг-провайдеры могут предложить гибкие среды «облачного» типа. Они добавляют уровень обработки, который всегда влияет на производительность. Grav всё ещё может быть быстрым на виртуальной машине (намного быстрее, чем Wordpress, Joomla и т. д.), Но всё же для оптимальной производительности вы не можете превзойти вариант нативного хостинга.
  4. Чем быстрее память, тем лучше. Поскольку Grav работает очень быстро и многие из его решений для кэширования сильно используют память, скорость памяти на вашем сервере может иметь большое влияние на производительность. Grav не использует большие объемы памяти по сравнению с некоторыми платформами, поэтому объем памяти не так важен и не влияет на производительность так сильно, как тип памяти и скорость.
  5. Общий хостинг дешев и доступен, но совместное использование ресурсов всегда немного замедляет работу. Опять же, Grav может очень хорошо работать на общем сервере (лучше, чем другие CMS), но для максимальной скорости лучше всего использовать выделенный сервер.
  6. Многоядерные процессоры лучше. Всегда помогут более быстрые и продвинутые процессоры, но не так сильно, как другие моменты.
  7. Парсер PECL Yaml. Установка собственного PHP-парсера PECL Yaml может увеличить анализ YAML на целых 400%! На это стоит обратить внимание, если вы ищете дополнительную скорость.

Getgrav.org работает на одном выделенном сервере с четырехъядерными процессорами, 16 ГБ памяти и твердотельными накопителями объёмом 6 ГБ. Мы также запускаем PHP 7.4 с Zend opcache и пользовательским кэшем APCu. На веб-серверах работает несколько других веб-сайтов, но не так много, как в среде общего хостинга.

Параметры кэширования⚓︎

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

Grav использует хорошо зарекомендовавшую себя библиотеку Doctrine Cache. Это означает, что Grav поддерживает любой механизм кэширования, поддерживаемый Doctrine Cache:

По умолчанию Grav предварительно настроен на использование параметра «auto». Сначала идет попытка обнаружения APC, затем WinCache, затем XCache и, наконец, File. Вы, конечно, можете явно настроить кэш в вашем файле user/config/system.yaml, что может немного ускорить работу.

Типы кэширования⚓︎

На самом деле в Grav существует 5 типов кэширования:

  1. Кэширование конфигурации YAML в PHP.
  2. Кэширование Core Grav для объектов страницы.
  3. Кэширование файлов шаблонов в Twig в виде классов PHP.
  4. Кэширование изображений для медиаресурсов.
  5. Кэширование ресурсов CSS и JQuery с конвейерной обработкой.

Кэширование конфигурации YAML не настраивается и всегда будет компилировать и кэшировать конфигурацию в папку /cache. Кэширование изображений также всегда включено и сохраняет обработанные изображения в папке /images.

Кэширование ядра Grav⚓︎

Кэширование ядра Grav имеет следующие параметры конфигурации, настроенные в вашем файле user/config/system.yaml:

cache:
  enabled: true                        # Установите значение `true`, чтобы включить кэширование
  check:
    method: file                       # Метод проверки обновлений на страницах: file|folder|hash|none
  driver: auto                         # Один из: auto|file|apc|xcache|memcache|wincache|redis
  prefix: 'g'                          # Строка префикса кэша (предотвращает конфликты)

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

По умолчанию Grav использует метод проверки файлов для кэширования. Это означает, что каждый раз, когда вы запрашиваете URL Grav, Grav использует оптимизированную маршрутизацию для прохождения всех файлов в папке user/pages, чтобы определить, изменилось ли что-нибудь.

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

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

Если автоматическое повторное кэширование измененных страниц не критично для вас (или если ваш сайт довольно большой), то установка этого значения на none ещё больше ускорит производственную среду. Вам просто нужно будет вручную очистить кэш после внесения изменений. Это предназначено для параметра Production-only.

Удаление страницы не очищает кэш, так как очистка кэша основана на метках времени изменения папок.

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

Специальные параметры Memcache⚓︎

Есть некоторые дополнительные параметры конфигурации, которые требуются, если вы подключаетесь к серверу memcache через параметр драйвера memcache. Эти параметры должны находиться в группе cache: в вашем user/config/system.yaml:

cache:
  ...
  memcache:
    server: localhost
    port: 11211

Специальные параметры Memcached⚓︎

Подобно memcache, memcached имеет некоторые дополнительные параметры конфигурации, которые требуются, если вы подключаетесь к серверу memcached через параметр драйвера memcached. Эти параметры должны находиться в группе cache: в вашем user/config/system.yaml:

cache:
  ...
  memcached:
    server: localhost
    port: 11211

Специальные параметры Redis⚓︎

Есть некоторые дополнительные параметры конфигурации, которые необходимы, если вы подключаетесь к серверу redis через параметр драйвера redis. Эти параметры должны находиться в группе cache: в вашем user/config/system.yaml:

cache:
  ...
  redis:
    server: localhost
    port: 6379

В качестве альтернативы вы можете использовать соединение через сокет:

cache:
  ...
  redis:
    socket: '/tmp/redis.sock'

Если ваш сервер Redis имеет пароль или секретный ключ, вы также можете установить его в этой конфигурации:

cache:
  ...
  redis:
    password: your-secret

Вам также понадобится php-redis, установленный в вашей системе.

Специальные параметры Twig⚓︎

Механизм создания шаблонов Twig использует свою собственную файловую систему кэширования, и с ней связано несколько параметров.

twig:
  cache: false                          # Установите значение `true`, чтобы включить кэширование Twig
  debug: true                           # Включить отладку Twig
  auto_reload: true                     # Обновлять кэш при изменениях
  autoescape: false                     # Экранирование переменных Twig

Для небольшого увеличения производительности вы можете отключить расширение debug, а также отключить auto_reload, которое выполняет функцию, аналогичную cache: check: method: none, так как оно не будет искать изменения в файлах .html.twig для запуска обновления кэш.

Кэширование и события⚓︎

По большей части, события всё ещё запускаются даже при включенном кэшировании. Это справедливо для всех событий, за исключением onPageContentRaw, onPageProcessed, onPageContentProcessed, onTwigPageVariables и onFolderProcessed. Эти события запускаются при рекурсии всех страниц и папок и запускаются на каждой найденной странице или папке. Как следует из их названия, они запускаются только во время обработки, а не после кэширования страницы.