web-dev-qa-db-fra.com

Comment l'agrégation CSS et JS fonctionne-t-elle dans Drupal?

Lorsque Drupal est configuré pour optimiser JS et CSS, il crée les dossiers 'js' et 'css' dans la racine de votre système de fichiers public. JS et CSS agrégés sont stockés dans ces répertoires. J'ai essayé de comprendre comment Drupal garde la trace de ces fichiers et comment Drupal fait correspondre la demande de page conséquente aux fichiers agrégés applicables dans ces répertoires. Le nom de fichier est-il un hachage sur la base, par exemple, de l'URL de demande?

En ce moment, je travaille sur un site qui a 4 serveurs web. Tous les serveurs Web ont le même stockage monté que leurs systèmes de fichiers publics et privés. Lorsqu'un serveur génère des fichiers CSS et JS pour une page, comment l'un des autres serveurs utilise-t-il ces fichiers générés pour une demande identique?

7
sbrattla

Les fichiers CSS/JS sont ajoutés à Drupal de différentes manières; 5 sur les 7 façons permet d'agréger le fichier. Une fois qu'ils ont été ajoutés à la page, drupal rend le balisage html pour eux et crée/utilise le balisage à l'intérieur de template_process_html () .

Les fonctions permettant de rechercher comment un agrégat est construit sont drupal_build_js_cache () & drupal_build_css_cache () . À l'intérieur de ces fonctions, il obtient une liste de noms de fichiers, puis en crée un hachage. Il s'agit d'une recherche pour voir si le fichier a déjà été créé.

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

S'il n'a pas été créé auparavant, en raison de l'ordre et/ou du contenu des informations $ file ['data'], il créera un nouvel agrégat basé sur l'ensemble du contenu des fichiers enchaînés.

  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;

Les fichiers sont conservés à l'intérieur de 2 variables drupal_js_cache_files et drupal_css_cache_files; Drupal vérifiera également que le fichier existe avant d'être utilisé. Les agrégats n'ont rien à voir avec l'URL. Vos 4 têtes Web utiliseront ces agrégats en raison des variables stockées dans la base de données .

Remarque: AdvAgg est en quelque sorte similaire à cela, mais il utilise quelques tables de base de données au lieu de 2 variables; AdvAgg le fait pour plusieurs raisons, principalement pour résoudre les problèmes avec les variables_set simultanés et permettre une logique de regroupement avancée.

14
mikeytown2