7

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

虽然我理解开发应该专注于创建擅长做一件事的单一用途模块(而不是做很多事情但不是很好的模块),但我在想我们是否开始使用提供有限功能的模块前面提到的,我们将需要组合数百个模块来构建一个丰富的应用程序,这可能会对性能造成灾难性的影响。相反,我希望将这种功能放在一个类中(例如Zend\I18n?)并按需加载,这将更加优化。但是知道阿克拉巴特的名声,我想我一定是遗漏了一些东西,因此我的问题是:

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

4

4 回答 4

3

不要将此评论作为最终答案,因为希望 ZF2 开发人员中的某些人会对此有所了解,但通常只会Module.php并且通常module.config.php会主动加载。其他所有内容都将简单地注册并按需调用。因此,只要您的 Module.php 和 module.config.php 的文件大小不是太大,性能就不应该是那么大的问题

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

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

于 2012-12-17T18:31:47.227 回答
0

正如 Sam 所指出的,加载一个模块并不比加载任何类多多少。只要您不使用模块中的任何东西并且做正确的事情,它就只是被注册了。

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

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

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

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

编辑:当您使用来自社区的模块时,您应该始终检查它们是否存在性能问题。即使是看起来很轻的模块,如果算法不好,也可能成为应用程序的瓶颈。但是,您正在加载附加模块的情况并不是重点。

于 2015-02-02T20:15:21.303 回答
0

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

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

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

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

因此,简而言之,应用程序应该可以很好地扩展,前提是模块表现良好,并且不会过度注册事件或滥用 ServiceLocator。

于 2015-10-16T22:53:47.023 回答
0

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

我上面提到的配置合并过程只发生在默认启用的 DEV 模式下。

还有一些技巧可以加快您的 ZF2 应用程序,例如:

  1. 启用合并配置缓存

  2. 使用EdpSuperluminal 模块

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

  4. 在 ViewModel 上显式设置模板名称

  5. 使用模板映射而不是单独使用模板路径堆栈

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

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

  8. Composer自动加载,而不是 ZF2

... 和更多。Gary Hockin关于 ZF2 应用程序性能的演讲非常好。

授权模块肯定会减慢您的应用程序。有很多事情发生在幕后:需要获取用户的身份(从数据库中?),需要根据您的规则对用户进行身份验证。当然,您可以通过使用 memcached 等来加快速度,但这需要对 ZF2 应用程序的生命周期、您使用的模块等有一些了解。

还有即将发布的 Zend Framework 3,有些事情会更快,但不要期望太多。大量开销是由于您对 ZF2 缺乏了解造成的——无意冒犯!

于 2016-03-24T21:06:22.023 回答