私はDrupal 7のサイトに多くのカスタムフィルターを設定しています。すべては正しく機能しますが、迅速ではありません。
cache_filterテーブルが常に空であるため、フィルターキャッシュシステムが正しく機能していないように見えます。 d.oには issues があります。返事はありません。
キャッシュは、入力形式で使用できる場合にのみ使用されます。これは、入力形式で使用される入力フィルターのいずれもキャッシュを無効にしないことを意味します。
入力フォーマットをテキストに適用する必要があるときに呼び出される関数 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()
を呼び出さずに4番目のパラメーター($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]);
}
これは、4番目のパラメータをhook_comment_view()
に渡すuser_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が有効になっている場合、それは素晴らしいです;)
または、kiamlalunoが指摘したように、フィルターの1つがキャッシュを無効にするため(例えば、PHPフィルター))、そのフィルターを使用するフォーマット全体はキャッシュできません。