Drupal ruft über 4000 mal "is_dir" auf?

17

Nachdem ich Probleme mit der Ladezeit einer sehr wichtigen Site hatte, installierte ich XHPROF und überprüfte die Statistiken, um herauszufinden, wo ich meinen Code verbessern kann.

Ich habe etwas Interessantes gefunden, das ich nicht verstehe. Drupal ruft "is_dir" bei fast jeder Anfrage über 4000 Mal auf und die Ausführung dauert ungefähr 800 ms. Warum ist das so und gibt es eine Möglichkeit, dies zu beschleunigen?

Bildschirmfoto

Bei einer Ladezeit von zwei bis vier Sekunden spielen 800ms eine große Rolle.

kiamlaluno
quelle
Haben Sie automatische Neuerstellungen der Registrierung aktiviert?
mpdonadio
@MPD Ich habe die automatischen Neuerstellungen der Registrierung deaktiviert.
Und so erkennt Drupal neue Module, Themes und Bibliotheken in verschiedenen Verzeichnissen!
Bhavin Joshi

Antworten:

19

Wenn Sie ein Modul deinstallieren, müssen Sie es zuerst im Administrator des Drupal-Moduls deaktivieren. Sie sollten es dann über die Registerkarte "Deinstallieren" dort deinstallieren.

Gleiches gilt für Themes. Deaktiviere zuerst den Theme-Admin.

Wenn Sie beispielsweise den Modulordner im Dateisystem löschen, ohne das Modul zu deaktivieren, sucht Drupal weiterhin im Dateisystem nach dem Modul, was unter anderem zu Fehlern bei dem aufgetretenen Problem führen kann.

Siehe auch: Vermeiden Sie das erneute Scannen des Modulverzeichnisses, wenn mehrere Module fehlen

Als Antwort auf den Kommentar von MPD müssen Sie so etwas tun

SELECT name, filename FROM system WHERE status = 1;

und verweisen Sie darauf, dass mit den Modulen in Ihrem Dateisystem. Alle aktivierten Module und auch Themen sollten vorhanden sein.

Es gibt auch eine Funktion (leicht angepasst), die Martin_Dresden hier veröffentlicht hat:

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);

}

Das kann beim Debuggen helfen.

David Thomas
quelle
1
Gibt es eine Möglichkeit, festzustellen, in welcher Zeile {system}das Problem liegt?
mpdonadio
@MPD Antwort mit möglicher Lösung dort aktualisiert.
David Thomas
Wenn ich ein Modul deaktiviere, aber nicht deinstalliere, gibt es in diesem Fall Nachteile gegenüber der Deinstallation?
Mario Awad
Das Modul hat eine Zeile in der Systemtabelle! Un installation löscht alles, was mit dem Modul in db und im Dateisystem zu tun hat, wenn die Routine 'un install' korrekt geschrieben wurde!
Bhavin Joshi