2013-10-20 9 views
8

Tốt hơn là nên sử dụng các lớp nhà máy hoặc đóng cửa trong Zend Framework 2 và tại sao?Các lớp nhà máy và đóng cửa trong Zend Framework 2

Tôi biết rằng đóng cửa không thể được tuần tự hóa, nhưng nếu bạn trả lại chúng từ Module # getServiceConfig(), điều này sẽ không ảnh hưởng đến bộ nhớ đệm của phần còn lại của dữ liệu cấu hình của bạn và các đóng sẽ được lưu trong bộ nhớ cache của bạn.

Hiệu suất khác nhau như thế nào trong việc xây dựng một lớp nhà máy so với thực hiện đóng cửa? Liệu PHP có bao bọc và khởi tạo các đóng cửa chỉ khi bạn thực hiện chúng hay nó sẽ làm điều này cho mọi đóng được định nghĩa trong tệp cấu hình của bạn trên mọi yêu cầu?

Có ai đã so sánh thời gian thực hiện của từng phương pháp không?

Xem thêm:

Trả lời

11

PHP sẽ chuyển đổi các chức năng ẩn danh trong cấu hình của bạn để thể hiện của lớp đóng cửa tại thời gian biên dịch vì vậy nó sẽ làm điều này trên mọi yêu cầu . Điều này không giống như create_function sẽ tạo chức năng tại thời gian chạy. Tuy nhiên, kể từ khi đóng cửa làm điều này tại thời gian biên dịch nó nên được trong bộ nhớ cache opcache của bạn và do đó không nên quan trọng.

Về tác động hiệu suất của việc xây dựng dịch vụ sử dụng nhà máy so với đóng trước hết bạn phải nhớ rằng dịch vụ sẽ chỉ được xây dựng một lần cho mỗi yêu cầu bất kể bạn yêu cầu dịch vụ bao nhiêu lần. Tôi chạy một chuẩn mực nhanh chóng lấy một dịch vụ sử dụng một đóng cửa và một nhà máy và đây là những gì tôi nhận được (tôi chạy một vài lần và tất cả các kết quả về cùng giá trị):

Closure: 0.026999999999999ns 
Factory: 0.30200000000002ns 

Đó là nano giây, nghĩa là 10 -9 giây. Về cơ bản sự khác biệt hiệu suất là quá nhỏ mà không có sự khác biệt hiệu quả.

Ngoài ra ZF2 không thể lưu lại cấu hình toàn bộ mô-đun của tôi bằng bao đóng. Nếu tôi sử dụng các nhà máy thuần túy thì toàn bộ cấu hình của tôi có thể được hợp nhất, lưu trữ và một tệp đơn giản có thể được đọc trên mỗi yêu cầu thay vì phải lo lắng về việc tải và hợp nhất các tệp cấu hình mỗi lần. Tôi đã không đo lường tác động hiệu suất của điều này, nhưng tôi đoán nó là biên trong mọi trường hợp.

Tuy nhiên, tôi thích các nhà máy có khả năng đọc và bảo trì chủ yếu. Với các nhà máy bạn không kết thúc với một số tập tin cấu hình lớn với tấn đóng cửa trên tất cả các nơi.

Chắc chắn, đóng cửa là rất tốt để phát triển nhanh chóng nhưng nếu bạn muốn mã của bạn có thể đọc được và duy trì được thì tôi muốn nói với các nhà máy.

+2

Về điều bộ nhớ đệm: Mọi thứ có đóng cửa phải nằm trong 'getXyzConfig()' của Mô-đun-Class của bạn. Chỉ cấu hình non-closure-config bên trong 'module.config.php';) – Sam

+0

Câu trả lời hay, cảm ơn Tom. – darkangel

+2

Chưa kể tất cả các bao đóng đều được tạo trên mọi yêu cầu, nhưng các lớp nhà máy chỉ được khởi tạo khi dịch vụ đằng sau chúng thực sự được yêu cầu. – DASPRiD

Các vấn đề liên quan