Отключение кэширования отдельного блока

Главные вкладки

Аватар пользователя Jenia Jenia 9 апреля 2008 в 2:56

Эта тема уже поднималась на форуме раза три. Но я так и не нашёл готового решения.
Есть блок, в блоке сниппет который вытягивает из таблицы базы случайную запись и печатает её. Нужно, чтобы при перезагрузке страницы запрос к БД выполнялся заново и заново вытягивалась информация. Естественно, при включенном кэшировании ничего на странице не обновляется, а остаётся неизменным. Вижу два выхода из этой ситуации:
1. Каким-то образом отключить кэширование блока.
2. Создать блок не стандартным методом, а при помощи какого-то специального модуля, в котором кэширование отключено.

Может кто-то подсказать что-то конкретное? Может кто-то реализовывал такое?

Комментарии

Аватар пользователя Jenia Jenia 9 апреля 2008 в 19:30

georotor, что даже никаким хаком это сделать невозможно? Но ведь это непраильно. Есть материалы, которые должны обновлятся, как мне это реализовать?

deska, модуль Block cache работает для зарегистированных юзеров, а не для всех.

Аватар пользователя Jenia Jenia 9 апреля 2008 в 20:38

Интересно, а если я через VIEW создам блок и в VIEW укажу, чтобы выводился случайный нод, то кэширование тоже будет срабатывать? Или в этом случае всё будет ОК?

Аватар пользователя georotor georotor 9 апреля 2008 в 21:42

как вариант подгружать содержимое блока через Java скрипт, я еще как то делал свой кэш, когда каждый блок кэшируется отдельно + контент кэшируется отдельно, а в при обращении к странице страница собирается по кусочкам.

Аватар пользователя Jenia Jenia 9 апреля 2008 в 21:49

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

Аватар пользователя georotor georotor 9 апреля 2008 в 21:55

что даже никаким хаком это сделать невозможно?
Можно, отключите кэш:)

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

Аватар пользователя georotor georotor 9 апреля 2008 в 21:57

Если посмотрите таблицу cache_page, то увидите что страница кэшируется целиком. Решить Вашу проблему можно, но только от стандартного кэша придется отказаться.

Аватар пользователя Jenia Jenia 10 апреля 2008 в 6:10

Короче говоря, я попробовал такой вариант: создал view для блока и указал в сортировке вывод случайного нода. Всё работает как для залогиненых юзеров, так и для анонимов.

Только вот у меня возникли некоторые опасения на счёт кэширования. При рандомном выведении нода будет ли страница кэшироватся или нет? Я думаю, что будет, так как для view есть отдельная таблица для кэша - cache_views . И логично было бы предполагать, что именно в эту таблицу добавляется запись о кэшировании view. В моём же случае, как я понимаю, запись добавлена не будет и мой view будет выполнятся каждый раз.

Есть кто-то, кто хорошо разбирается в кэшировании drupal? Подскажите, насколько верны мои выводы? Как проверить кэшируется конкретная страница или нет?

Аватар пользователя kiev1 kiev1 11 апреля 2008 в 9:51

неужели в друпале такой тупой кеш что кеширует не как положено - блоки отдельно, страницы отдельно, комменты отдельно - а все целиком???!!!!!!!
я был лучшего мнения о умственных способностях его создателей, хотя помню что в 4.5 друпале даже не было возможности определить произвольную зону для блоков, а только лево-право - то да...
хотя все таки друпал создавал не один человек и это наверно его оправдывает

Аватар пользователя Jenia Jenia 11 апреля 2008 в 17:48

Я вот не пойму как и что кэширует Друпал. Таблица для кэша не одна, так что мне кажется, что есть какое-то разделение. Вот только по поводу моего решения через view никто ничего не отвечает.

Аватар пользователя kiev1 kiev1 11 апреля 2008 в 22:08

какое-то разделение наметилось только в 5-м друпале и то... ну например - зачем кешировать меню когда надо кешировать блоки которые происходят из этого меню, зачем кешировать целиком контент когда надо кешировать отдельно страничку - отдельно комментарии - с кешем у друпала очень все плохо, в отличие от views - есть у views отдельный кеш, есть и инструменты для управления им и в случае надобности можно довольно неплохо при выводе в теме нужного вида продумать его кеширование, если-б еще и views было такое-же как остальной кеш - то оно наверно совсем туго работало-бы.

насчет вашего вопроса - у меня например в блоке на одном сайте сделан рандомный запрос к базе - запрос без views а так сам по себе - так вот вроде обновляется и для анонимных иногда - блок справа в левой колонке

Аватар пользователя Jenia Jenia 12 апреля 2008 в 1:34

У Вас наверное выставлено короткое время жизни кэша, поэтому и для анонимных иногда обновляется. У меня блок со снипетом закэшировался и не обновляется вовсе. Хотя, если у views свой кэш, то я сделаю через views. Спасибо за помощь!

Аватар пользователя kiev1 kiev1 12 апреля 2008 в 1:56

не - я установил по умолчанию когда время обновления не лимитировано - я так понимаю что когда какое-то время установлено - то он сбросится по истечении этого времени гарантированно, а когда не установлено - то есть наверно вероятность что проживет больше.

Аватар пользователя Jenia Jenia 12 апреля 2008 в 5:35

Блин, как я ошибался, когда думал, что моя проблема решается через views. Просто тестировал на домашнем компе, а там кэширование было выключено. Короче говоря, сделал через JavaScript + PHP за 15 минут. Но я считаю, что это не правильно. Такая задача должна решатся стандартным Друпаловским функционалом.