web-dev-qa-db-ja.com

プログラムですべてのビューのキャッシュを無効/有効にする方法は?

ケース:私のサイトには50を超えるビューがあり、パフォーマンスを向上させるために、実装中にすべてのデータをキャッシュすることができました。

今、私は何らかの理由ですべてのビューのキャッシュを一度に無効にしたいと思います(よりリアルタイムにする)。

助けてください。

1
echo

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つのビューのみ)。

1
Jance

永続的な解決策を探している場合。更新フックで行うことをお勧めします。影響を与えるビューまたはビュー/ディスプレイの配列を作成し、次のようなことを行います

<?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() を参照してください。

1
General Redneck

ビューはPHP配列としてデータベースに保存されるため、可能ではないと思います。

ただし、キャッシュテーブルは2つありますcache_viewsおよびcache_views_dataには、さまざまなキャッシュされたアイテムが含まれています。これらのテーブルの内容を空にすると、リクエストごとにこれらのテーブルを空にする必要がある場合を除いて、キャッシュをオフにするのと同じ効果があります。

0
Colin Shipton

このモジュールを探していると思います 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',
    ));
  }
}
0
mikeytown2