Рейтинг:0

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

флаг cn

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

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

Есть ли способ создать страницу, чтобы блоки могли обмениваться информацией? Прямо сейчас оба элемента страницы выполняют одни и те же вызовы базы данных, вызывая дублирование запросов и увеличивая время загрузки страницы?

флаг cn
Обычный подход заключается в определении службы, которая запрашивает данные и статически кэширует результаты. Затем оба блока используют соответствующий метод из этой службы, но только первое использование приводит к попаданию в БД. [`drupal_static`](https://api.drupal.org/api/drupal/core%21includes%21bootstrap.inc/function/drupal_static/9.2.x) очень полезен для этого
4uk4 avatar
флаг cn
Кроме того, обычно вещи, которые вы запрашиваете в базе данных, могут кэшироваться между запросами. Вы можете поместить результат запроса в корзину кэша, например, `cache_default`, и пометить его так, чтобы он становился недействительным при изменении данных в базе данных.
Rubix05 avatar
флаг cn
Ого, я даже не знал, что существует drupal_static. У меня уже были встроенные функции с сервисом, поэтому я смог очень быстро установить drupal_static.Мне все еще нужно провести еще несколько тестов, но пока это, похоже, именно то, что мне нужно. Спасибо!
4uk4 avatar
флаг cn
Если у вас уже есть служба, вам не нужен drupal_static, потому что свойства класса службы сохраняются на протяжении всего запроса.
Rainer Feike avatar
флаг in
Помимо решения этой проблемы с производительностью с помощью drupal или php (скажем, на стороне клиента), вы должны решить ее в своем бэкэнде БД. Для современных БД, выполняющих один и тот же запрос несколько раз, следует расширяться только в первый раз. Скорее, вам следует сосредоточиться на кэше на стороне клиента, как указано в Drupal Cache API https://www.drupal.org/docs/8/api/cache-api/cache-api. И - по умолчанию - кеш Drupal также хранится в БД - так что вы можете сэкономить только время расчета запроса, но не пропускную способность.... Кэширование никогда не бывает легким.
Rainer Feike avatar
флаг in
Но согласен с 4к4 эт.все. Если все это в одном и том же запросе, просто используйте переменную области запроса (но это не так, если ваш блок имеет другие контексты, чем ваша страница).

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

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.