Drupal memanggil "is_dir" lebih dari 4000 kali?

17

Setelah mengalami masalah saat memuat situs yang sangat penting, saya menginstal XHPROF dan melihat statistik untuk melihat di mana saya dapat meningkatkan kode saya.

Saya menemukan sesuatu yang menarik yang tidak saya mengerti. Panggilan Drupal "is_dir" lebih dari 4000 kali pada hampir setiap permintaan dan ini membutuhkan sekitar 800 ms untuk dijalankan. Mengapa begitu dan adakah cara untuk mempercepat itu?

tangkapan layar

Dengan waktu pemuatan dua hingga empat detik adalah 800 ms mengambil bagian besar.

kiamlaluno
sumber
Apakah Anda mengaktifkan kembali registri secara otomatis?
mpdonadio
@ MPD Saya telah menonaktifkan rekondisi registri otomatis.
Dan inilah cara Drupal mengenali modul, tema, dan perpustakaan baru di direktori yang berbeda!
Bhavin Joshi

Jawaban:

19

Ketika Anda menghapus modul, Anda harus menonaktifkannya terlebih dahulu di admin modul Drupal. Anda kemudian harus menghapusnya melalui tab "Copot pemasangan" di sana.

Hal yang sama berlaku untuk tema, nonaktifkan di admin tema terlebih dahulu.

Jika Anda misalnya, menghapus folder modul pada sistem file tanpa menonaktifkan modul, Drupal akan terus mencari modul dalam sistem file, yang dapat mengakibatkan, di antara kesalahan lain, dalam masalah yang Anda alami.

Lihat juga: Hindari memindai ulang direktori modul ketika banyak modul hilang

Sebagai jawaban atas komentar MPD, Anda perlu melakukan sesuatu seperti

SELECT name, filename FROM system WHERE status = 1;

dan referensi silang dengan modul pada sistem file Anda. Semua modul yang diaktifkan, dan juga tema, harus ada.

Ada juga fungsi (sedikit disesuaikan) Martin_Dresden diposting di sini:

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

}

Itu dapat membantu men-debug.

David Thomas
sumber
1
Apakah ada cara untuk menentukan baris {system}yang bermasalah?
mpdonadio
Jawaban @MPD diperbarui dengan kemungkinan solusi di sana.
David Thomas
Jika saya menonaktifkan modul tetapi tidak mencopotnya, apakah ada kerugian dalam hal ini dibandingkan dengan mencopotnya juga?
Mario Awad
Modul ini akan memiliki baris dalam tabel sistem! Un instalasi menghapus semua yang berhubungan dengan modul di db dan di sistem file jika rutin 'un install' ditulis dengan benar!
Bhavin Joshi