Drupal appelle «is_dir» plus de 4000 fois?

17

Après avoir eu des problèmes sur le temps de chargement d'un site très important, j'ai installé XHPROF et j'ai examiné les statistiques pour voir où je pouvais améliorer mon code.

J'ai trouvé quelque chose d'intéressant que je ne comprends pas. Drupal appelle "is_dir" plus de 4000 fois sur presque chaque requête, ce qui prend environ 800 ms à exécuter. Pourquoi est-ce et existe-t-il un moyen d'accélérer cela?

capture d'écran

Par un temps de chargement de deux à quatre secondes, 800 ms jouent un rôle important.

kiamlaluno
la source
Les reconstructions automatiques du registre sont-elles activées?
mpdonadio
@MPD J'ai désactivé les reconstructions automatiques du registre.
Et c'est ainsi que Drupal reconnaît de nouveaux modules, thèmes et bibliothèques dans différents répertoires!
Bhavin Joshi

Réponses:

19

Lorsque vous désinstallez un module, vous devez d'abord le désactiver dans l'admin du module Drupal. Vous devez ensuite le désinstaller via l'onglet "Désinstaller".

Il en va de même pour les thèmes, désactivez d'abord l'administrateur du thème.

Si, par exemple, vous supprimez le dossier du module sur le système de fichiers sans désactiver le module, Drupal continuera à rechercher le module dans le système de fichiers, ce qui peut entraîner, entre autres erreurs, le problème que vous rencontrez.

Voir aussi: Évitez de ré-analyser le répertoire des modules lorsque plusieurs modules sont manquants

En réponse au commentaire de MPD, vous devrez faire quelque chose comme

SELECT name, filename FROM system WHERE status = 1;

et croisez cela avec les modules de votre système de fichiers. Tous les modules activés et les thèmes doivent également être présents.

Il y a aussi une fonction (légèrement adaptée) Martin_Dresden publiée ici:

https://drupal.org/node/1080330#comment-6520842

function MYMODULE_init() {

    $startingtime = microtime(true); 
    $o = '<p>Checking for dead modules ...</p>';
    $result = db_select('system')
      ->fields('system', array('filename'))
      ->condition('status', '1', '=')
      ->execute();
      $n = 1;
      $m = 0;
    foreach ($result as $row) {
      $path = DRUPAL_ROOT.'/'.$row->filename;
      If (!file_exists($path)) { 
          $o .= "#$n $path<br>";
          $m++;
      }
      $n++;
    }
    $timedif =  round(microtime(true) - $startingtime,3);
    $o .= "Total of $n active modules registered in database. $m dead entries found.<br>";
    $o .= 'Query Time: '.$timedif.' seconds';

    drupal_set_message($o);

}

Cela peut aider au débogage.

David Thomas
la source
1
Existe-t-il un moyen de déterminer la ligne {system}du problème?
mpdonadio
Réponse @MPD mise à jour avec une solution possible là-bas.
David Thomas
Si je désactive un module sans le désinstaller, y a-t-il des inconvénients dans ce cas par rapport à le désinstaller également?
Mario Awad
Le module aura une ligne dans la table système! Une installation efface tout ce qui concerne le module dans la base de données et dans le système de fichiers si la routine de «désinstallation» est correctement écrite!
Bhavin Joshi