Wie funktioniert die Aggregation von CSS und JS in Drupal?

7

Wenn Drupal so eingestellt ist, dass JS und CSS optimiert werden, werden die Ordner 'js' und 'css' in Ihrem öffentlichen Dateisystemstamm erstellt. Aggregiertes JS und CSS werden in diesen Verzeichnissen gespeichert. Ich habe versucht herauszufinden, wie Drupal diese Dateien verfolgt und wie Drupal die daraus resultierende Seitenanforderung mit den entsprechenden aggregierten Dateien in diesen Verzeichnissen vergleicht. Ist der Dateiname ein Hash, der beispielsweise auf der Anforderungs-URL basiert?

Im Moment arbeite ich an einer Site mit 4 Webservern. Alle Webserver verfügen über denselben Speicher wie ihre öffentlichen und privaten Dateisysteme. Wenn ein Server CSS- und JS-Dateien für eine Seite generiert, wie verwendet einer der anderen Server diese generierten Dateien für eine indentische Anforderung?

sbrattla
quelle

Antworten:

14

CSS / JS-Dateien werden auf verschiedene Arten zu Drupal hinzugefügt. 5 von 7 Möglichkeiten ermöglicht die Aggregation der Datei. Sobald sie der Seite hinzugefügt wurden, rendert drupal das HTML-Markup für sie und erstellt / verwendet das Markup in template_process_html () .

Funktionen zum Suchen, wie ein Aggregat erstellt wird, sind drupal_build_js_cache () & drupal_build_css_cache () . Innerhalb dieser Funktion wird eine Liste mit Dateinamen abgerufen und anschließend ein Hash erstellt. Dies ist eine Suche, um festzustellen, ob die Datei bereits erstellt wurde.

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

Wenn es aufgrund der Reihenfolge und / oder des Inhalts der $ file ['data'] -Informationen noch nicht erstellt wurde, wird ein neues Aggregat erstellt, das auf allen aneinandergereihten Dateiinhalten basiert.

  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;

Die Dateien werden innerhalb von 2 Variablen verfolgt drupal_js_cache_filesund drupal_css_cache_files; Drupal überprüft außerdem, ob die Datei vorhanden ist, bevor sie verwendet wird. Die Aggregate haben nichts mit der URL zu tun. Ihre 4 Webheads verwenden diese Aggregate aufgrund der in der Datenbank gespeicherten Variablen.

Hinweis: AdvAgg ähnelt dem, ähnelt jedoch ein paar Datenbanktabellen anstelle von zwei Variablen. AdvAgg tut dies aus mehreren Gründen, hauptsächlich um Probleme mit gleichzeitigen Variablensätzen zu beheben und eine erweiterte Gruppierungslogik zu ermöglichen.

mikeytown2
quelle