Фильтры Drupal не могут быть кэшированы


У меня есть сайт Drupal 7 со множеством пользовательских фильтров. Все работает правильно, но не быстро.
Похоже, что система кэширования фильтров работает неправильно, потому что таблица cache_filter всегда пуста. В d.o. есть вопросы, но на них нет ответа.

Author: kiamlaluno, 2011-03-18

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 = '';
  }
}
 2
Author: kiamlaluno, 2011-03-18 12:56:47

Если таблица cache_filter пуста, но включен memcache или APC, то это здорово;)

Или, как указал киамлалуно, один из ваших фильтров отключает кэш (например, фильтр PHP), так что весь формат, использующий этот фильтр, не может быть кэширован.

 1
Author: jcisio, 2011-03-18 08:11:48