computed field и кэширование

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

Аватар пользователя t-m-p t-m-p 9 февраля 2013 в 21:29

Поставил computed field. Настроил вывод данных.
Нужно чтоб данные выводились постоянно обновленные. Они же прописываются в кэше и выдается постоянно устаревшая инфа.
Подскажите - где можно настроить кэширование полей (и можно ли без правки модуля)?
Уже час прошел, а кэш не обновляется.

Комментарии

Аватар пользователя t-m-p t-m-p 10 февраля 2013 в 19:30

да у меня кеш как раз пока не включен. Но все равно ведь друпал кеширует записи контента в cache_content. Пробовал уже и включить кеш с 1 минутой, но и так обновления не происходит. Бред какой то. с Views это модуль работает вообще бездарно. Кто его писал - руки бы поотрывать.
Интересно то, что в таблице cache_content есть столбец expire. Там везде стоит значение 0. если его руками в БД исправить на 1 (к примеру), происходит обновление, но значение возвращается в 0. Вот тут думаю нужно копать.

Спасибо за наводку на модуль cacheexclude, ща посмотрю что он делает.

Если не поможет - придется модуль править с использованием столбца expire Smile

Аватар пользователя t-m-p t-m-p 10 февраля 2013 в 19:56

я конечно удивлен, но модуль не исключает из кеша записи выводимые в строках computed field.
Придется сейчас все таки модуль разбирать. Smile

Аватар пользователя t-m-p t-m-p 11 февраля 2013 в 16:02

Nikit, спасибо за участие! У меня первая мысль была об ajax Smile Но в таком случае придется передавать в открытую путь к исполняемому файлу пхп и необходимые параметры в открытом виде. А мне как раз нельзя этого пказывать юзерам. нужно выполнять все эти операции только на стороне сервера.
Нашел вчера решение. Очень мало информации по вопросу кэша. Трудно было найти что то конкретное. Помогла вот эта статья
http://amgrade.net/blog/keshirovanie-v-drupal

Отвечает за эту операцию функция CCK модуля в файле content.module - function content_load(&$node)

И вот самая последняя операция (запись в кэш):
cache_set($cid, $default_additions, content_cache_tablename());

не учитывает ввод времени жизни кэша.
Поэтому нужно добавить самому. Smile
cache_set($cid, $default_additions, content_cache_tablename(), time() + 360);

Так у нас будут записываться данные в кэш с временем жизни 6 минут.
Но и в таком случае - этого не достаточно. Ввиду уникальности друпаловской работы с кэшем - для полного обновления еще необходимо запустить крон. Вот в таком случае кеш обновится полностью.

Что- что - но реально в друпале работа с кешем дошла до маразма. Жал, но пока альтернатив Друпалу сейчас нет, так бы конечно рассмотрел вопрос о смене цмс-ки.

В общем по сути вопроса - апи друпала не изучал. Поэтому пока отдельным модулем переопределить функцию content_load не получилось. Буду просто править модуль content.module .
Осталось внести условия для очистки кэша только нужных строк Smile

PS
Можно еще использовать модуль dynamicfield-6.x-1.0. В этом случае результаты выполнения пхп-кода вообще не будут попадать в кэш. Но я подумал что для производительности в моей задаче все таки лучше кэшировать результат на 12 часов. Smile

Аватар пользователя Nikit Nikit 12 февраля 2013 в 1:34

Не очень хорошее решение - модить cck, ведь теперь все cck поля будут кещированы всего на 6 часов, а ведь обычно они никогда не меняются. Лучше создай свой модуль, и подгружай только свое поле по своему кешу в hook_nodapi.

"t-m-p" wrote:
о в таком случае придется передавать в открытую путь к исполняемому файлу пхп
там будет путь к друпал, не к php, опасности никакой, если всё правильно сделать...

Аватар пользователя t-m-p t-m-p 12 февраля 2013 в 17:28

Nikit, Спасибо за подсказку по поводу hook_nodapi! Я пытался через него как раз и делать. но не получилось. Придется все таки немного вникнуть в друпаловский апи Smile так же придется расширить знания в ajax Smile Постараюсь это все объединить вместе Smile

Аватар пользователя Alex12345 Alex12345 13 января 2014 в 12:33

Тоже столкнулся с проблемой кеширования модуля Computed Field, постоянно показывает старые значения из кеша.

Да уж, в этой ветке так и не указали конкретного простого решения.

Мне пришлось сделать сложно и криво, но работает:
через скрипт MySQL перезаполняю значения вычисляемого поля,
удаляю строки из таблицы кеша Drupal (delete from cache_field where cid like 'field:node:%'),
добавил скрипт в cron с нужной периодичностью.