在Zend Framework 2中使用工厂类或闭包更好吗?为什么?
我知道闭包不能序列化,但是如果你从Module#getServiceConfig()返回它们,这不会影响其余配置数据的缓存,而且闭包也会缓存在你的操作码缓存中。< / p>
构建工厂类与执行闭包的性能有何不同? PHP是否仅在执行时包装和实例化闭包,或者它是否会在每次请求时为配置文件中定义的每个闭包执行此操作?
有没有人比较过每种方法的执行时间?
另见:
答案 0 :(得分:11)
PHP会在配置时将配置中的匿名函数转换为闭包类的实例,因此它会在每个请求中执行此操作。这与create_function
不同,Closure: 0.026999999999999ns
Factory: 0.30200000000002ns
将在运行时创建函数。但是,由于闭包在编译时执行此操作,因此它应该在您的opcache缓存中,因此无关紧要。
就使用工厂与关闭构建服务的性能影响而言,首先必须记住,无论您要求服务多少次,服务都将仅按请求构建一次。我运行了一个使用闭包和工厂获取服务的快速基准测试,这就是我得到的(我跑了几次,所有结果都是相同的值):
{{1}}
这些是纳秒,即10 -9 秒。基本上,性能差异很小,没有有效的差异。
ZF2也无法使用闭包缓存整个模块的配置。如果我使用纯工厂,那么我的整个配置可以合并,缓存,并且可以在每个请求上读取一个简单的文件,而不必担心每次加载和合并配置文件。我没有测量过它对性能的影响,但我猜它在任何情况下都是微不足道的。
但是,我更喜欢工厂,主要是可读性和可维护性。对于工厂,你不会得到一些庞大的配置文件,其中包含大量的闭包。
当然,关闭对于快速开发很有帮助,但是如果你希望你的代码可读和可维护,那么我会说坚持工厂。