ZF2模块加载性能

据我所知, ZF2应用程序中的每个启用模块ZF2为每个请求加载(除非使用zf2-lazy-loading-module模块提供的优化方法)。 我一直关注在modules.zendframework.org上发布的模块,并且我遇到了提供极其有限功能的模块,例如用于将电话号码格式化为英国格式的AkrabatFormatUkTelephone模块。

虽然我理解开发的重点应该是创建单一目的的模块,它擅长做一件事(而不是以很好的方式做很多事情的模块),我想如果我们开始使用模块,它提供的功能有限提到的那个,我们将需要结合数百个模块才能构建一个可能对性能造成灾难性影响的丰富应用程序。 相反,我希望这种功能可以放在一个类中(例如ZendI18n ?),并按需要加载,这样会更加优化。 但知道Akrabat的声誉,我想我一定会错过一些东西,因此我的问题是:

是否像我提到的那样加载模块的性能比通过PHP类加载相同的功能要差得多(或者由于ZF2的设计方式,它是否类似)? 有没有人有关于模块与类加载性能的数据(比如5%,10%,15%)?


不要将此评论作为最终答案,因为希望ZF2开发者的某些人可以对此有所了解,但通常只有Module.php和通常module.config.php将被主动加载。 其他的一切都将被简单地注册并按需求调用。 所以只要你的Module.php和module.config.php在文件大小上不是太大,性能不应该成为一个大问题

在Akrabats例子的情况下,所发生的就是新的ViewHelper的注册表。 没有其他的。 Zend中的所有其他视图助手也是如此。 在这些情况下,性能实际上并不重要。

就个人而言,我的Webspace上加载了80ms的Skeleton,并且使用了BjyAuthorize,ZfcBase,ZfcUser和我自己的模块,加载时间增加到100ms。 这是没有任何形式的内存缓存启用!


加载一个模块并不比加载任何类,就像Sam指出的那样。 只要你不使用你的模块中的任何东西,并且做正确的事情,它只是在注册。

现在“做正确的事”是什么意思?

试着在你的模块类bootstrap()方法中放一个大的无意义循环。 您会看到这会减慢应用程序中的每个请求,因为您的模块的引导方法会在每个请求中调用,并且应该非常小心地使用它,仅适用于轻量级任务。 您通常使用bootstrap()方法的目的,甚至不会使您的应用程序减速一毫秒,但在此方法中将文件写入磁盘可能会使您的应用程序在每个请求中停顿数秒。

如果你的应用变得非常沉重,你应该尽可能地使用classmap_autoloader和一些缓存。 如果你做了“正确的事情”,就不会有任何性能问题,只是因为你的应用中有许多模块或许多类。 人们可以说,这只是算法。

继续使用最佳实践,就像你提到的那样。 通常这些不是你的应用程序的瓶颈,但你自己的算法和失败是。

编辑:当你使用社区中的模块时,你应该经常检查它们的性能问题。 即使是一个看似非常轻的模块,如果它的算法不好,也可能成为应用程序的瓶颈。 但是您加载额外模块的情况并不是它的要点。


好问题。 我想对Sam的反应作出一点贡献。

模块性能不仅仅是模块的负载(正如指出的那样),还包括模块之间的通信。 所以这个问题可能归结为:与传统的非模块化系统相比,ServiceLocator和事件驱动系统有多慢/多快?

我记得ZF2是以性能为基础的。 例如,ServiceLocator注册工厂,以便可以即时实例化对象。 所以这只需要一些额外的内存中的对象和实例,我想这不会影响应用程序的整体性能。 EventManager的工作方式大致相同,即使在大型应用程序中,我也没有看到它被注册事件重载。

另一方面,可能减慢的是模块配置的加载。 我认为使用缓存可能会解决这个问题。 我不确定,但也许Zend Optimizer可能会这样做。

因此,总之,应用程序应该很好地扩展,只要模块表现良好,并且不要过度注册事件或误用ServiceLocator。

链接地址: http://www.djcxy.com/p/11609.html

上一篇: ZF2 module loading performance

下一篇: What happens when java program starts?