Drupal gọi điện thoại is_dir trên hơn 4000 lần?


17

Sau khi gặp sự cố về thời gian tải trang web rất quan trọng, tôi đã cài đặt XHPROF và xem qua các số liệu thống kê để xem nơi tôi có thể cải thiện mã của mình.

Tôi tìm thấy một điều thú vị mà tôi không hiểu. Drupal gọi "is_dir" trong hơn 4000 thời gian cho gần như mọi yêu cầu và việc này mất khoảng 800ms để thực hiện. Tại sao lại như vậy và có cách nào để tăng tốc không?

ảnh chụp màn hình

Thời gian tải từ hai đến bốn giây là 800ms chiếm một phần lớn.


Bạn có bật lại đăng ký tự động?
mpdonadio

@MPD Tôi đã vô hiệu hóa việc xây dựng lại registry tự động.

Và đây là cách Drupal nhận ra các mô-đun, chủ đề và thư viện mới trong các thư mục khác nhau!
Bhavin Joshi

Câu trả lời:


19

Khi bạn gỡ cài đặt một mô-đun, trước tiên bạn cần phải tắt nó trong quản trị viên mô-đun Drupal. Sau đó, bạn nên gỡ cài đặt nó thông qua tab "Gỡ cài đặt" ở đó.

Điều tương tự cũng xảy ra với các chủ đề, vô hiệu hóa trong quản trị chủ đề đầu tiên.

Ví dụ, nếu bạn xóa thư mục mô-đun trên hệ thống tệp mà không tắt mô-đun, Drupal sẽ tiếp tục tìm kiếm mô-đun trong hệ thống tệp, điều này có thể dẫn đến các lỗi khác trong vấn đề bạn gặp phải.

Xem thêm: Tránh quét lại thư mục mô-đun khi thiếu nhiều mô-đun

Trả lời bình luận của MPD, bạn sẽ cần phải làm một cái gì đó như

SELECT name, filename FROM system WHERE status = 1;

và tham chiếu chéo với các mô-đun trên hệ thống tệp của bạn. Tất cả các mô-đun kích hoạt, và chủ đề cũng vậy, nên có mặt.

Cũng có một chức năng (thích nghi một chút) Martin_Dresden được đăng ở đây:

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

}

Điều đó có thể giúp gỡ lỗi.


1
Có cách nào để xác định hàng nào trong đó {system}là vấn đề không?
mpdon Arena

@MPD trả lời cập nhật với giải pháp có thể có.
David Thomas

Nếu tôi vô hiệu hóa một mô-đun nhưng không gỡ cài đặt nó, có bất kỳ nhược điểm nào trong trường hợp này so với việc gỡ cài đặt nó không?
Mario Awad

Các mô-đun sẽ có một hàng trong bảng hệ thống! Hủy cài đặt sẽ xóa mọi thứ liên quan đến mô-đun trong db và trong hệ thống tệp nếu thói quen 'un install' được viết đúng!
Bhavin Joshi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.