it-swarm-es.com

Drupal filtros no se pueden almacenar en caché

Tengo un sitio Drupal 7 con muchos filtros personalizados. Todo funciona correctamente, pero no rápido.
Parece que el sistema de caché de filtro no funciona correctamente porque la tabla cache_filter siempre está vacía. Existe el problemas en d.o. pero no responde.

2
ya.teck

La caché se usa solo cuando el formato de entrada está habilitado para usarla; esto significa que ninguno de los filtros de entrada que utiliza el formato de entrada deshabilita la caché.

El código de check_markup () , que es la función que se llama cuando es necesario aplicar un formato de entrada a un texto, contiene el siguiente código.

$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 Es un parámetro que se pasa a la función, y $format Es la variable que contiene el valor devuelto por filter_format_load () ; si $format->cache es FALSE, no se utilizará la caché de filtro.

En el caso del contenido del cuerpo de un nodo, la función que se utiliza para desinfectar el contenido del cuerpo (y el contenido de otros campos) es _ text_sanitize () , que invoca check_markup() sin usar el cuarto parámetro ($cache), que por defecto es FALSE. Esto significa que, sea cual sea el filtro que esté configurado para usar la caché o no, la caché no se utilizará.

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]);
}

Esto es diferente de lo que hizo user_comment_view () (la implementación de hook_comment_view() que se usa para filtrar la firma del usuario que escribió el comentario), que pasa el cuarto parámetro a check_markup(), configurándolo en 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
kiamlaluno

Si la tabla cache_filter está vacía, pero Memcache o APC están habilitados, entonces es genial;)

O como señaló kiamlaluno, uno de sus filtros deshabilita la caché (por ejemplo, PHP filtro) para que todo el formato que usa ese filtro no se pueda almacenar en caché.

1
jcisio