2013-10-20 19 views
8

在Zend Framework 2中使用工廠類或閉包更好嗎?爲什麼?我知道閉包不能被序列化,但是如果你從Module#getServiceConfig()返回它們,這不會影響其餘配置數據的緩存,並且閉包也會緩存在你的操作碼緩存中。Zend Framework 2中的工廠類和閉包2

構建工廠類與執行閉包的性能有何不同? PHP只有在執行它們時才包裝和實例化閉包,還是會在每個請求中爲配置文件中定義的每個閉包執行此操作?

有沒有人比較過每種方法的執行時間?

參見:

回答

11

PHP將在配置中匿名函數轉換爲封閉類的實例在編譯時所以它會做到這一點在每次請求。這不同於create_function,它將在運行時創建該功能。但是,由於閉包在編譯時會執行此操作,因此它應該位於opcache緩存中,因此應該沒有關係。

就使用工廠構建服務與封閉性能影響而言,首先您必須記住,無論您要求服務多少次,該服務只會針對每個請求構建一次。我跑採用封閉和工廠獲取服務的快速標杆,這裏是我得到了什麼(我跑了幾次,所有的結果都是差不多的值):

Closure: 0.026999999999999ns 
Factory: 0.30200000000002ns 

這些都是納秒,即10 -9秒。基本上性能差異非常小,沒有有效的差異。

另外ZF2無法緩存我的整個模塊的配置與閉包。如果我使用純粹的工廠,那麼我的整個配置可以合併,緩存,每個請求可以讀取一個簡單的文件,而不必擔心每次加載和合並配置文件。我還沒有測量過這個性能的影響,但我想這在任何情況下都是微不足道的。

但是,我更喜歡工廠的主要可讀性和可維護性。對於工廠來說,你不會得到一個龐大的配置文件,並且會有大量的關閉。

當然,閉包是偉大的快速發展,但如果你希望你的代碼可讀性和可維護性,然後我會說棍子工廠。

+2

關於高速緩存的事情:所有關閉的東西都應該放在模塊類的getXyzConfig()裏面。只有non-closure-config裏面'module.config.php';) – Sam

+0

很好的回答,謝謝湯姆。 – darkangel

+2

更不用說每個請求都會創建閉包,但工廠類僅在實際需要其後的服務時才實例化。 – DASPRiD