Drupalは「is_dir」を4000回以上呼び出していますか?


17

非常に重要なサイトの読み込み時間に問題があった後、XHPROFをインストールし、統計を調べてコードを改善できる場所を確認しました。

私にはわからない面白いことを見つけました。Drupalは、ほぼすべての要求で4000時間以上「is_dir」を呼び出します。これには、実行に約800msかかります。それはなぜですか、それをスピードアップする方法はありますか?

スクリーンショット

2〜4秒の読み込み時間で800msが大きな部分を占めます。


レジストリの自動再構築が有効になっていますか?
mpdonadio

@MPDレジストリの自動再構築を無効にしました。

これが、Drupalが異なるディレクトリにある新しいモジュール、テーマ、ライブラリを認識する方法です!
バビンジョシ

回答:


19

モジュールをアンインストールするとき、最初にDrupalモジュール管理でそれを無効にする必要があります。次に、「アンインストール」タブからアンインストールする必要があります。

テーマについても同様です。最初にテーマ管理で無効にします。

たとえば、モジュールを無効にせずにファイルシステム上のモジュールフォルダーを削除すると、Drupalはファイルシステム内のモジュールの検索を続行します。これにより、発生している問題でエラーが発生する可能性があります。

参照:複数のモジュールが欠落している場合のモジュールディレクトリの再スキャンの回避

MPDのコメントに答えて、次のようなことをする必要があります。

SELECT name, filename FROM system WHERE status = 1;

ファイルシステム上のモジュールと相互参照します。すべての有効なモジュールとテーマも存在する必要があります。

ここには、Martin_Dresden関数(わずかに適合した)もあります。

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

}

デバッグに役立つ場合があります。


1
どの行に{system}問題があるかを判断する方法はありますか?
mpdonadio

@MPDの回答が更新され、解決策があります。
デビッドトーマス

モジュールを無効にしてアンインストールしない場合、この場合もアンインストールと比較して不利な点はありますか?
マリオ・アワド

モジュールには、システムテーブルに行があります!「アンインストール」ルーチンが適切に記述されている場合、アンインストールは、dbおよびファイルシステムのモジュールに関連するすべてを消去します!
バビンジョシ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.