Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php ZF2模块加载性能_Php_Performance_Class_Zend Framework2_Autoload - Fatal编程技术网

Php ZF2模块加载性能

Php ZF2模块加载性能,php,performance,class,zend-framework2,autoload,Php,Performance,Class,Zend Framework2,Autoload,据我所知,ZF2应用程序中的每个启用模块都会为每个请求加载(除非使用模块提供的优化方法)。我一直在关注在上发布的模块,我遇到了提供极其有限功能的模块,例如用于将电话号码格式化为英国格式的模块 虽然我理解开发应该专注于创建擅长做一件事的单用途模块(而不是做很多事情但不是很好的模块),但我认为如果我们开始使用提供上述有限功能的模块,我们需要结合数百个模块来构建一个丰富的应用程序,这可能会对性能造成灾难性的影响。相反,我希望将此类功能放在一个类(例如?)中,并按需加载,这样会更加优化。但知道阿克拉巴特

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

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


与通过PHP类加载相同的功能相比,加载我提到的模块对性能的影响是否明显更差(或者由于ZF2的设计方式而类似)?有人对模块与类加载性能有什么看法吗(比如,是不是慢了5%,10%,15%)?

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

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


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

正如Sam指出的那样,加载模块并不比加载任何类都重要。 只要你不使用你模块中的任何东西,并且把事情做好,它就是注册的

现在“把事情做好”是什么意思?

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

如果你的应用程序变得很重,你应该使用classmap_自动加载器和一些缓存。如果你做得“对”,你就不会有任何性能问题,仅仅因为你的应用程序中有许多模块或类。有人可能会说,这都是关于算法的

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

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

好问题。我想对山姆的反应做一点贡献

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

我记得ZF2是在考虑性能的情况下构建的。例如,ServiceLocator注册工厂,以便可以动态实例化对象。因此,这只需要几个额外的内存对象和实例化,我想这不会对应用程序的总体性能产生太大影响。EventManager的工作方式基本相同,我没有看到它被注册事件重载,即使在大型应用程序中也是如此

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


因此,简言之,只要模块表现良好,并且不过度注册事件或误用ServiceLocator,应用程序的可扩展性应该相当好。

从MVC组件的角度来看,根本没有模块!有一个大的配置文件-每个模块的配置合并的结果。除非您的模块没有一个
onBootstrap
方法,或者没有做很多事情,否则模块加载的速度与在每个模块上调用
new module
的速度一样快,这既省力又节省内存

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

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

  • 启用合并配置缓存

  • 使用

  • 从动作而不是数组返回ViewModel对象

  • 在ViewModel上显式设置模板名称

  • 使用模板映射,而不是仅使用模板路径堆栈

  • 配置中的路由顺序很重要!这是一个后进先出队列

  • 确保没有在HTTP上下文中加载控制台模块

  • <