Фильтры Drupal не могут быть кэшированы
У меня есть сайт Drupal 7 со множеством пользовательских фильтров. Все работает правильно, но не быстро.
Похоже, что система кэширования фильтров работает неправильно, потому что таблица cache_filter всегда пуста.
В d.o. есть вопросы, но на них нет ответа.
2 answers
Кэш используется только тогда, когда формат ввода разрешен для его использования; это означает, что ни один из входных фильтров, используемых форматом ввода, не отключает кэш.
Код check_markup(), функция, вызываемая, когда к тексту необходимо применить формат ввода, содержит следующий код.
$cache = $cache && !empty($format->cache);
$cache_id = '';
if ($cache) {
$cache_id = $format->format . ':' . $langcode . ':' . hash('sha256', $text);
if ($cached = cache_get($cache_id, 'cache_filter')) {
return $cached->data;
}
}
$cache
является параметром, передаваемым функции, и $format
является переменной, содержащей значение, возвращаемое filter_format_load(); если $format->cache
равно FALSE
, кэш фильтра использоваться не будет.
В случае содержимого тела узла функция, используемая для очистки содержимого тела (и содержимого других полей), является _text_sanitize(), которая вызывает check_markup()
без использования четвертого параметра ($cache
), который по умолчанию равен FALSE
. Это означает, что независимо от того, настроен фильтр на использование кэша или нет, кэш использоваться не будет.
function _text_sanitize($instance, $langcode, $item, $column) {
// If the value uses a cacheable text format, text_field_load() precomputes
// the sanitized string.
if (isset($item["safe_$column"])) {
return $item["safe_$column"];
}
return $instance['settings']['text_processing'] ? check_markup($item[$column], $item['format'], $langcode) : check_plain($item[$column]);
}
Это отличается от что сделано с помощью функции user_comment_view() (реализация hook_comment_view()
, которая используется для фильтрации подписи пользователя, написавшего комментарий), которая передает четвертый параметр в check_markup()
, устанавливая его в TRUE
.
function user_comment_view($comment) {
if (variable_get('user_signatures', 0) && !empty($comment->signature)) {
// @todo This alters and replaces the original object value, so a
// hypothetical process of loading, viewing, and saving will hijack the
// stored data. Consider renaming to $comment->signature_safe or similar
// here and elsewhere in Drupal 8.
$comment->signature = check_markup($comment->signature, $comment->signature_format, '', TRUE);
}
else {
$comment->signature = '';
}
}
Если таблица cache_filter пуста, но включен memcache или APC, то это здорово;)
Или, как указал киамлалуно, один из ваших фильтров отключает кэш (например, фильтр PHP), так что весь формат, использующий этот фильтр, не может быть кэширован.