ZF2模块加载性能

时间:2012-12-17 17:57:03

标签: php performance class zend-framework2 autoload

据我了解,ZF2应用程序中的每个已启用模块都会为每个请求加载(除非使用zf2-lazy-loading-module模块提供的优化方法)。我一直在关注在modules.zendframework.org上发布的模块,而且我遇到了功能极其有限的模块,例如用于格式化手机的AkrabatFormatUkTelephone模块数字为英国格式。

虽然我理解开发应该专注于创建擅长做一件事的单一目的模块(而不是做很多事情但不是很好的模块),我想是否开始使用模块提供如上所述的有限功能,我们需要组合数百个模块,以构建一个可能对性能造成灾难性的丰富应用程序。相反,我希望将这种功能放在一个类(例如Zend\I18n?)中并按需加载,这将更加优化。但是,知道Akrabat的声誉,我认为我必须遗漏一些东西,因此我的问题是:

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

4 个答案:

答案 0 :(得分:3)

不要把这个评论作为最终答案,因为希望ZF2开发者的某些人能够更多地了解它,但通常只有Module.phpmodule.config.php通常会被主动加载。其他所有内容都只需注册并按需调用。因此,只要你的Module.php和module.config.php在文件大小上不是太大,性能就不应该是一个大问题

在Akrabats示例中,所有发生的事情都是新ViewHelper的注册表。没有其他的。与Zend中的所有其他视图助手相同。在这些情况下,表现并不重要。

我的Webspace上个人加载了80ms的Skeleton,以及BjyAuthorize,ZfcBase,ZfcUser和我自己的模块,加载时间增加到100ms。这是没有启用任何类型的内存缓存!

答案 1 :(得分:0)

加载模块不仅仅是加载任何类,如Sam指出的那样。 只要您不使用模块中的任何内容并做正确的事情,它就会被注册。

现在做什么"做正确的事情"意味着吗

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

如果你的应用变得非常沉重,你应该使用classmap_autoloader和一些缓存,无论你在哪里。如果您做了正确的事情,那么您就不会遇到任何性能问题,只是因为您的应用中有许多模块或许多类。可以说,它只是算法的全部。

继续使用最佳做法,例如您提到的做法。通常这些不是您应用程序的瓶颈,但您自己的算法和失败都是。

编辑: 当您使用社区中的模块时,应始终检查它们是否存在性能问题。即使是一个看起来非常轻的模块,如果它的算法不好,也可能成为你应用的瓶颈。但是你加载一个额外模块的情况并非如此。

答案 2 :(得分:0)

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

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

我记得ZF2的构建考虑了性能。例如,ServiceLocator注册工厂,以便可以即时实例化对象。因此,这只需要一些额外的内存中对象和实例,我想这不会对应用程序的总体性能产生太大影响。 EventManager的工作方式大致相同,即使在大型应用程序中,我也没有看到它因注册事件而过载。

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

因此,简而言之,只要模块运行良好,并且不会过度注册事件或滥用ServiceLocator,应用程序应该可以扩展。

答案 3 :(得分:0)

从MVC组件的角度来看,根本没有模块!有一个大的配置文件 - 每个模块的配置合并的结果。除非你的模块没有onBootstrap方法或者做不了多少工作,否则模块加载速度与在每个模块上调用new Module一样快,这是无痛且内存便宜的。

上面提到的配置合并过程仅在DEV模式下发生,默认情况下启用。

还有许多技巧可以加速你的ZF2应用程序,例如:

  1. 启用合并配置缓存

  2. 使用EdpSuperluminal module

  3. 从操作返回ViewModel对象,而不是数组

  4. 在ViewModel

  5. 上明确设置模板名称
  6. 仅使用模板映射而不是模板路径堆栈

  7. 配置中的路线顺序很重要!它是一个LIFO队列(后进先出)。

  8. 确保不在HTTP上下文中加载控制台模块。

  9. Composer进行自动加载,而不是ZF2

  10. ......等等。 ZF2应用程序的性能有quite good talk Gary Hockin

    授权模块肯定会降低您的应用速度。引擎盖下有很多东西:需要提取用户的身份(来自数据库?),用户需要再次根据您的规则进行身份验证。当然,您可以通过使用memcached等来加快速度,但这需要了解ZF2应用程序的生命周期,您使用的模块等等。

    还有Zend Framework 3即将发布,有些事情会更快,但不要期望太多。很多开销是由于你缺乏对ZF2的了解 - 没有冒犯!

相关问题