2013-10-20 18 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