CSSとJSアグリゲーションはDrupalでどのように機能しますか?


7

DrupalがJSおよびCSSを最適化するように設定されている場合、パブリックファイルシステムのルートに「js」および「css」フォルダーが作成されます。集約されたJSとCSSはこれらのディレクトリに保存されます。Drupalがこれらのファイルを追跡する方法と、結果のページ要求をこれらのディレクトリ内の適用可能な集約ファイルと照合する方法を理解しようとしました。ファイル名は、たとえばリクエストURLに基​​づくハッシュですか?

現在、4つのWebサーバーがあるサイトで作業しています。すべてのWebサーバーには、パブリックファイルシステムとプライベートファイルシステムと同じストレージがマウントされています。1つのサーバーがページのCSSファイルとJSファイルを生成すると、他のサーバーはこれらの生成されたファイルを同一の要求にどのように利用しますか?

回答:


14

CSS / JSファイルは、さまざまな方法でDrupalに追加されます。7つの方法のうち5つを使用すると、ファイルを集約できます。それらがページに追加されると、drupalはそれらのhtmlマークアップをレンダリングし、template_process_html()内でマークアップを作成/使用します。

集約がどのように構築されるかを調べる関数は、drupal_build_js_cache()およびdrupal_build_css_cache()です。これらの関数の内部では、ファイル名のリストを取得し、それらのハッシュを作成します。これはルックアップであり、ファイルがすでに作成されているかどうかを確認します。

  $map = variable_get('drupal_js_cache_files', array());
  // Create a new array so that only the file names are used to create the hash.
  // This prevents new aggregates from being created unnecessarily.
  $js_data = array();
  foreach ($files as $file) {
    $js_data[] = $file['data'];
  }
  $key = hash('sha256', serialize($js_data));
  if (isset($map[$key])) {
    $uri = $map[$key];
  }

$ file ['data']情報の順序や内容が原因で、以前に作成されていない場合は、すべてのファイルの内容が結合された新しい集合体が作成されます。

  if (empty($uri) || !file_exists($uri)) {
    // Build aggregate JS file.
    foreach ($files as $path => $info) {
      if ($info['preprocess']) {
        // Append a ';' and a newline after each JS file.
        $contents .= file_get_contents($path) . ";\n";
      }
    }
    // Prefix filename to prevent blocking by firewalls which reject files
    // starting with "ad*".
    $filename = 'js_' . drupal_hash_base64($contents) . '.js';
    // Create the js/ within the files folder.
    $jspath = 'public://js';
    $uri = $jspath . '/' . $filename;
    ...
    $map[$key] = $uri;
    variable_set('drupal_js_cache_files', $map);
  }
  return $uri;

ファイルは2つの変数drupal_js_cache_filesとの内部で追跡されますdrupal_css_cache_files。Drupalはまた、使用前にファイルが存在することを確認します。集計はURLとは関係ありません。変数がデータベースに格納されているため、4つのWebヘッドはこれらの集計を利用します。

注:AdvAggはこれに似ていますが、2つの変数の代わりにいくつかのデータベーステーブルを使用します。AdvAggは、主に並行variable_setの問題を修正し、高度なグループ化ロジックを可能にするいくつかの理由でこれを行います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.