Tối ưu Code Event Listener trong XenForo 1.2

Thảo luận trong 'Development Tutorials' bắt đầu bởi Linhnt, 20/8/13.

1votes
5/5, 1 vote

  1. Linhnt

    Linhnt Member

    Bài viết:
    19
    Likes :
    26
    Hệ thống Code Event Listener của XF chưa được tối ưu. Các XenForo Developer vẫn đang tìm cách tối ưu và ở phiên bản 1.2 có một tính năng mới là Event Hint. Tính năng này là tùy chọn, chưa bắt buộc phải dùng. Sau đây là ví dụ về cách sử dụng:

    Giả sử tôi cần viết 1 Add-on có 3 class cần ghi đè: XenForo_Model_Thread, XenForo_Model_Forum, XenForo_Model_User.

    Với cách viết cũ:
    Chỉ cần tạo 1 Event với Listener như sau:
    PHP:
    class My_Addon_Listener    {
       
        public static function 
    load_class_model($class, array &$extend)    {
            
    $classes = array(
                
    'XenForo_Model_Thread',
                
    'XenForo_Model_Forum',
                
    'XenForo_Model_User'
            
    );
            if (
    in_array($class$classes)) {
                
    $extend[] = 'My_Addon_' $class;
            }
        }
       
    }
    Nhược điểm:
    - Bất cứ khi nào một Class Model được khởi tạo thì phương thức load_class_model sẽ được chạy. XF có nhiều Model nên phương thức này bị gọi rất nhiều lần, phần lớn là không có tác dụng gì. Code thừa gây phí phạm tài nguyên, ảnh hưởng đến performance

    - Đọc đến đây chắc nhiều người nghĩ đoạn code ngắn kia chẳng ảnh hưởng gì. Nhưng thật sự nó không nhẹ như bề ngoài. Thử debug cụ thể:
    + $classes có 3 phần tử
    + Hàm in_array($class, $classes); trong trường hợp không khớp sẽ có độ phức tạp tương đương với 1 vòng lặp có 3 lần lặp chứa tổng cộng 3 phép so sánh
    + Giả sử tại 1 trang có 3 class Model được gọi thì event này sẽ tạo ra 9 lần lặp với 9 phép so sánh
    + Forum dùng nhiều Add-on chứ không chỉ một. Vì vậy tổng cộng của nhiều Add-on sẽ tạo ra hàng trăm phép so sánh. Và phần lớn là vô nghĩa ảnh hưởng không nhỏ đến performance

    - Ví dụ tương đối này chỉ là phần nhỏ, chưa nói lên được tất cả các nhược điểm của hệ thống cũ

    Về Event Hint:
    - Các nhà phát triển của XenForo đã nhìn ra vấn đề này và đưa thêm tính năng Event Hint. Với Event Hint thì listener chỉ được chạy khi chính xác class cần ghi đè được load. Và hàng trăm phép so sánh ở trên sẽ không chạy dù chỉ 1.
    - Tất nhiên Event Hint cũng sẽ tạo thêm ra các phép so sánh nội tại bên trong nó, như đã nói ở đầu bài: Hệ thống Code Event Listener chưa được tối ưu. Nhưng đây là việc của các nhà phát triển XF, dần dần họ sẽ có cách. Với người viết Add-ons bình thường. Chỉ cần tối ưu hết mức có thể trong phạm vi khả năng là được.

    Cách viết mới trong XenForo 1.2 dùng Event Hint:
    Vẫn với Add-ons ở trên, giờ "convert" lên 1.2:
    Add-on có 3 class cần ghi đè: XenForo_Model_Thread, XenForo_Model_Forum, XenForo_Model_User.

    Với 3 class cần ghi đè, sẽ phải tạo 3 Code Event Listener dùng chung 1 phương thức load_class, event hint điền tên của class muốn ghi đè. Đây là nội dung class listener:
    PHP:
    class My_Addon_Listener   {   
       public static function 
    load_class($class, array &$extend)   {
         
    /* $class được xác định bằng Event Hint nên không cần if */
         
    $extend[] = 'My_Addon_' $class;
       }
    }
    Với cách viết này sẽ phải tạo nhiều Event Listener nhưng lại tối ưu về performance
     

    Các file đính kèm:

    Đang tải...
  2. p3iu18

    p3iu18 Member

    Bài viết:
    298
    Likes :
    123
    Đọc nhiều lần mà không hiểu gì. Bạn có thể nói rõ hơn chút, chẳng hạn như : "Event Listener, Event Hint...." nó dùng để làm gì :)
     
    o0MongCo0o thích bài này.
  3. mikalaza142

    mikalaza142 New Member

    Bài viết:
    5
    Likes :
    1
    Chúc bạn bán đắt hàng nè
     
  4. p3iu18

    p3iu18 Member

    Bài viết:
    298
    Likes :
    123
    Cái này phải mua àh :-B
     
    o0MongCo0o thích bài này.
comments powered by Disqus
: Event Hint

Chia sẻ trang này

Đang tải...