ケース:私のサイトには50を超えるビューがあり、パフォーマンスを向上させるために、実装中にすべてのデータをキャッシュすることができました。
今、私は何らかの理由ですべてのビューのキャッシュを一度に無効にしたいと思います(よりリアルタイムにする)。
助けてください。
features と少しハッキングすることで、すべてをオフにすることができます。また、これには多くのことを一括して変更することが含まれるため、実行する前に必ず作業をバックアップし、まず開発サーバーでテストしてください。
フィーチャーを使用すると、ビューのみを含むフィーチャーを作成できます。次に、この機能をダウンロードできます。これにより、モジュールファイルによく似たものが表示されます。
このモジュールのファイルの1つはyour_feature.views_default.incと呼ばれるファイルです。このファイルには、ビューエクスポートスクリプトのようにALOTに見える一連のコードが含まれます(これはまさにそのためです)。
コードの行を見ると、それぞれがビューの構成を表しています。次のような行がたくさんあるはずです。
$handler->display->display_options['cache']['type'] = 'time';
$handler->display->display_options['cache']['results_lifespan'] = '3600';
$handler->display->display_options['cache']['results_lifespan_custom'] = '0';
$handler->display->display_options['cache']['output_lifespan'] = '3600';
$handler->display->display_options['cache']['output_lifespan_custom'] = '0';
キャッシングの設定方法によって異なります。いずれにせよ、すべてのビューのキャッシュをオフにしたい場合は、これらすべての行が次のようになる必要があります。
$handler->display->display_options['cache']['type'] = 'none';
編集が完了したら、ファイルを保存して、機能モジュールをサイトのすべてのサイト/ all/modulesフォルダーにアップロードします。
アップロードされたら、サイトに戻り、機能管理者(admin/structure/features)に移動すると、機能がそこにぶら下がっていて、状態が「オーバーライドされている」はずです。 「オーバーライド」をクリックすると、機能の概要が表示され、画面の右下に「コンポーネントを元に戻す」という便利なボタンが表示されます。ビューリストの横にあるチェックボックスをクリックして(元に戻す機能を機能に伝えます)、元に戻すコンポーネントをクリックして、ビューをコードに格納されているものに戻します。
ここで、この方法を使用することにはマイナス面があります。機能が機能する方法は、実際にはビューを受け取り、DBではなくコードに格納することです。したがって、機能を削除すると、実際にはビューも削除されます。これは、ビューを編集するまで当てはまります。その場合、データベースに戻ります(すべてではなく、その1つのビューのみ)。
永続的な解決策を探している場合。更新フックで行うことをお勧めします。影響を与えるビューまたはビュー/ディスプレイの配列を作成し、次のようなことを行います
<?php
$views = array(
'view1' => array(),
'view1' => array('master', 'display_1'),
);
foreach ($views as $view_name => $displays) {
$view = views_get_view($view_name);
foreach($view->display as &$display) {
if (empty($displays) || isset($view->display[$display]) {
$display->display_options['cache']['type'] = 'none';
}
}
$view->save();
}
(開発/テスト目的などで)一時的な解決策を探している場合は、settings.phpまたはlocal.settings.phpファイルで$conf['views_skip_cache'] = TRUE;
を設定することを検討してください。これにより、ビューのキャッシュが完全にオフになります。 views_cache_get() を参照してください。
ビューはPHP配列としてデータベースに保存されるため、可能ではないと思います。
ただし、キャッシュテーブルは2つありますcache_views
およびcache_views_data
には、さまざまなキャッシュされたアイテムが含まれています。これらのテーブルの内容を空にすると、リクエストごとにこれらのテーブルを空にする必要がある場合を除いて、キャッシュをオフにするのと同じ効果があります。
このモジュールを探していると思います https://www.drupal.org/project/views_cache_bully
スライド26 のスピーカーノートに記載されています。DIYからDrupal 7パフォーマンスプレゼンテーション
モジュールがどのように機能するかを見て、実装したいのは hook_views_pre_view() です。ここで魔法がモジュールで起こります
/**
* Implements hook_views_pre_view().
*/
function views_cache_bully_views_pre_build(&$view) {
// Run if this view does not have a cache.
if ($view->display_handler->get_plugin('cache')->plugin_name == 'none') {
// Make views_cache_bully_view_is_exempt() available.
module_load_include('inc', 'views_cache_bully');
if (!views_cache_bully_view_is_exempt($view)) {
// Enable the view cache.
$view->display_handler->override_option('cache', array(
'type' => 'time',
'results_lifespan' => variable_get('views_cache_bully_results_lifespan', 3600),
'output_lifespan' => variable_get('views_cache_bully_output_lifespan', 3600),
));
}
}
}
だからあなたの場合はこれに変更します
/**
* Implements hook_views_pre_view().
*/
function mymodule_views_pre_build(&$view) {
// Run if this variable is enabled.
if (variable_get('mymodule_no_views_cache', TRUE)) {
// Disable the view cache.
$view->display_handler->override_option('cache', array(
'type' => 'none',
));
}
}