logo

Paleta - Deixe colorido🎨

Palette — Construtor visual de páginas. Não precisa ser designer.

Demonstração ao vivo Baixar Palette

Scroll
30/04/2020, by maria
Cache tags = зависимости данных
Cache tags описывают зависимости от данных, управляемых Drupal

Почему?

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

Importante num CMS/framework como Drupal pois o mesmo conteudo reutiliza-se de varias formas - impossivel saber a priori onde usara-se; onde quer usado pode cachear-se significando dezenas de lugares. Levando a citacao famosa: na computacao ha so dois problemas dificeis invalidacao de cache e nomes - ou seja como invalidar todos os itens usando o conteudo?

Nota: D7 oferecia 3 formas: CID especifico prefixo CID ou bin inteiro - nenhuma permite invalidar itens contendo entity alterada pois era incognoscivel!

Какая?

Тег кеша - это строка.

Кэшированные теги передаются в наборах (порядок не имеет значения) строк, поэтому они печатаются в string[]. Это наборы, потому что один элемент кэша может зависеть от многих тегов кэша.

Syntax

По соглашению, они имеют форму thing:identifier - и когда нет понятия нескольких экземпляров вещи, она имеет форму thing. Единственное правило заключается в том, что он не может содержать пробелы.

Там нет строгого синтаксиса.

Примеры:

  • node:5 - тег кеша для Node узла 5 (аннулируется всякий раз, когда он изменяется)
  • user:3 - тег кеша для объекта User 3 (становится недействительным при каждом его изменении)
  • node_list - список тегов кэша для объектов Node (аннулируется всякий раз, когда любой объект Node обновляется, удаляется или создается, т. е. когда может потребоваться изменить список узлов). Применимо к любому типу сущности в следующем формате: {entity_type} _list.
  • config:system.performance - тег кеша для конфигурации system.performance
  • library_info - тег кеша для библиотек активов

Общие теги кеша

Данные, которыми управляет Drupal, делятся на 3 категории:

  • entities - у них есть теги кэша вида <entity type ID>:<entity ID>, а также <entity type ID>_list и <entity type ID>_list:<bundle> для аннулирования списков сущностей. Типы объектов конфигурации используют тег кеша базового объекта конфигурации.
  • configuration - они имеют теги кеша в форме config:<configuration name>
  • пользовательский "custom" (например, library_info)

Drupal предоставляет кеш-теги для сущностей и конфигурации автоматически - см. Базовый класс Entity и базовый класс ConfigBase. (Все конкретные типы сущностей и объекты конфигурации наследуются от них.)

Хотя многие типы объектов следуют за предсказуемым форматом тега кэша <entity type ID>:<entity ID>, сторонний код не должен полагаться на это. Вместо этого он должен получить теги кеша для аннулирования для единственного объекта, используя метод : :getCacheTags(), например, $node->getCacheTags(), $user->getCacheTags(), $view->getCacheTags() и т. д.

Alem disso pode precisar invalidar caches-lista dependentes dos dados (ex.: HTML do listing ao criar nova): use EntityTypeInterface::getListCacheTags() invalidando retornos junto as tags proprias. Начиная с Drupal 8.9 (уведомление об изменении), сущности с пакетами также автоматически имеют более конкретный тег кеша, который включает их пакет, чтобы обеспечить более целенаправленное аннулирование списков.

Tambem defina tags custom mais especificas conforme valores ex.: campo referencia a termo para listas mostrando objetos com tal termo; invalidacao dessas cabe em hooks presave/delete:

function yourmodule_node_presave(NodeInterface $node) {
  $tags = [];
  if ($node->hasField('field_category')) {
    foreach ( $node->get('field_category') as $item) {
     $tags[] = 'mysite:node:category:' . $item->target_id;
    }
  }
  if ($tags) {
      Cache::invalidateTags($tags);
  }
}

Эти теги можно использовать в коде и в представлениях, используя предоставленный модуль Views Custom Cache Tag.

Примечание. В настоящее время не существует API для получения отдельных пакетов и более конкретных тегов кэша от объекта или другого объекта. Это связано с тем, что не тот объект, который решил, какие теги кэша списка являются релевантными для определенного списка / запроса, зависит от самого запроса. Versoes futuras provavelmente melhorarao suporte embutido por bundle integrando no entity query builder e views.

Как

Настройка

Любой кеш-сервер должен реализовывать CacheBackendInterface, поэтому при установке элемента кеша с помощью метода ::set() укажите третий и четвертый аргументы, например:

$cache_backend->set(
  $cid, $data, Cache::PERMANENT, ['node:5', 'user:7']
);

Guarda item $cid permanente sujeito porem a invalidacao pelas tags node:5 ou user:7

Утратившие силу

Теговые элементы кэша становятся недействительными через их теги, используя cache_tags.invalidator:invalidateTags() (или, когда вы не можете внедрить cache_tags.invalidator службы: Cache::invalidateTags()), которая принимает набор тегов кэша (string[]) ,

Примечание: это делает недействительными элементы, помеченные данными тегами, во всех ячейках кэша. Pois nao faz sentido invalidar por bin individual: dados alterados podem depender de itens noutros bins.

Отладка

Все вышеперечисленное является полезной информацией при отладке чего-либо, что кэшируется. Но есть еще одна вещь: скажем, что-то кэшируется с помощью тегов кеша ['foo', 'bar']. Тогда соответствующий элемент кэша будет иметь столбец тегов (если на мгновение предположить, что кэш базы данных) со следующим значением:

bar foo

Другими словами:

  • теги кеша разделены пробелом
  • теги кеша сортируются по алфавиту

Это должно облегчить анализ и отладку кешей!

Заголовки (отладка)

Наконец: легко увидеть, от каких тегов кеша зависит определенный ответ (и, следовательно, он становится недействительным): достаточно взглянуть только на заголовок X-Drupal-Cache-Tags!

(Именно поэтому пробелы запрещены: потому что заголовок X-Drupal-Cache-Tags, как и многие HTTP-заголовки, использует пробелы для разделения значений.)

Примечание. Если вы не видите эти заголовки, вам нужно настроить экземпляр Drupal для разработки.

Интеграция с обратными прокси

Вместо того, чтобы кэшировать ответы в Drupal и делать их недействительными с помощью тегов кэша, вы также можете кэшировать ответы в обратных прокси (Varnish, CDN ...) и затем делать недействительными ответы, которые они кэшировали, используя теги кэша, связанные с этими ответами. Чтобы эти обратные прокси-серверы знали, какие теги кэша связаны с каждым ответом, вы можете отправить теги кэша вместе с заголовком.

Так же, как Drupal 8 может отправлять заголовок X-Drupal-Cache-Tags для отладки, он также может отправлять заголовок Surrogate-Keys со значениями, разделенными пробелами, как ожидается некоторыми CDN, или заголовок Cache-Tag со значениями, разделенными запятыми, как и ожидалось другими CDN. И это также может быть обратный прокси-сервер, который вы запускаете самостоятельно, а не коммерческий сервис CDN.

Как правило, рекомендуется, чтобы и ваш веб-сервер, и ваш обратный прокси-сервер поддерживали заголовки ответов со значениями до 16 КБ.

1. 1. HTTP e textual logo tags tambem; proxies podem representar internamente noutra estrutura. O limite 16KB escolheu-se por 2 fatores: A funcionar em 99% B praticamente alcancavel - servers tipicos (Apache) e CDNs tipicos (rapido) suportam 16KB ~1000 tags suficiente para 99%. Типичные веб-серверы (Apache) и типичные CDN (быстро) поддерживают значения заголовка ответа 16 КБ. Это означает примерно 1000 тегов кеша, что достаточно для 99% случаев.
2. 2. Quantidade varia bastante por site/resposta: resposta dependendo de muitas coisas tera muitas tags; acima de 1000 raro.
3. 3. Claro o guia (~1000/resposta) evolira com o tempo vendo A mais apps reais usarem B sistemas construindo sobre essa capacidade.

Por fim acima de 1000 provavelmente indica problema mais fundo: resposta complexa demais devendo dividir-se; nada impede passar disso mas pode exigir tuning manual aceitavel em casos extremos - podendo aplicar-se ate bem menos que 1000.

Прочитайте документацию по использованию Varnish с тегами кеша.

Известно, что CDN поддерживают аннулирование/очистку на основе тегов:

CloudFlare
Fastly
KeyCDN
Akamai

Внутренний кэш страницы

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

Смотрите также