Drupal调用“ is_dir”超过4000次?


17

在遇到非常重要的站点的加载时间麻烦之后,我安装了XHPROF,并查看了统计信息以查看可以在哪里改进代码。

我发现了一些我不理解的有趣东西。Drupal在几乎每个请求上都在4000多个时间内调用“ is_dir”,这大约需要800毫秒才能执行。为什么会这样,有没有办法加快速度呢?

屏幕截图

2-4秒钟的加载时间是800ms的很大一部分。


您是否打开了自动注册表重建功能?
mpdonadio

@MPD我已禁用自动注册表重建。

这就是Drupal识别不同目录中的新模块,主题和库的方式!
Bhavin Joshi

Answers:


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答案已在此处更新了可能的解决方案。
大卫·托马斯

如果我禁用了一个模块但不卸载它,那么与同时卸载它相比,有什么缺点吗?
Mario Awad 2013年

该模块在系统表中将有一行!如果正确编写了“卸载”例程,则卸载将擦除db和文件系统中与模块相关的所有内容!
Bhavin Joshi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.