Drupal 4000 defadan fazla “is_dir” mi diyor?


17

Çok önemli bir sitenin yüklenme süresinde sıkıntı yaşadıktan sonra XHPROF'u kurdum ve kodumu nerede geliştirebileceğimi görmek için istatistikleri inceledim.

Anlamadığım ilginç bir şey buldum. Drupal, neredeyse her istekte 4000'den fazla "is_dir" çağırır ve bu işlemin gerçekleştirilmesi yaklaşık 800 ms sürer. Bu neden ve bunu hızlandırmanın bir yolu var mı?

ekran görüntüsü

İki ila dört saniyelik bir yükleme süresi ile 800 ms büyük bir rol oynar.


Otomatik kayıt defteri yeniden oluşturma özelliği açık mı?
mpdonadio

@MPD Otomatik kayıt defterini yeniden oluşturmayı devre dışı bıraktım.

Drupal farklı dizinlerdeki yeni modülleri, temaları ve kütüphaneleri bu şekilde tanır!
Bhavin Joshi

Yanıtlar:


19

Bir modülü kaldırdığınızda, önce Drupal modül yöneticisinde devre dışı bırakmanız gerekir. Ardından, oradaki "Kaldır" sekmesinden kaldırmanız gerekir.

Aynı şey temalar için de geçerlidir, önce tema yöneticisinde devre dışı bırakın.

Örneğin, modülü devre dışı bırakmadan dosya sistemindeki modül klasörünü silin, Drupal, dosya sisteminde modülü aramaya devam eder, bu da karşılaştığınız sorunla ilgili diğer hataların yanı sıra.

Ayrıca bkz: Birden fazla modül eksikken modül dizinini yeniden taramaktan kaçının

MPD'nin yorumuna cevap olarak, böyle bir şey yapmanız gerekecek

SELECT name, filename FROM system WHERE status = 1;

ve dosya sisteminizdeki modüller ile çapraz referans. Tüm etkin modüller ve temalar da mevcut olmalıdır.

Martin_Dresden burada yayınlanan (biraz uyarlanmış) bir fonksiyon var:

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

}

Hata ayıklamaya yardımcı olabilir.


1
{system}Sorunun hangi satırda olduğunu belirlemenin bir yolu var mı ?
mpdonadio

@MPD yanıtı orada olası çözüm ile güncellendi.
David Thomas

Bir modülü devre dışı bırakırsam, ancak kaldırmazsam, bu durumda kaldırmaya kıyasla dezavantajları var mı?
Mario Awad

Modülün sistem tablosunda bir satırı olacaktır! Un kurulumu, 'un install' rutini düzgün yazılmışsa, db ve dosya sistemindeki modülle ilgili her şeyi siler!
Bhavin Joshi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.