Tre*_*ent 6 php optimization performance zend-framework autoloader
我正在使用Zend Framework 1.11,Doctrine 2,一些Symfony 2组件以及其他工具和库来开展项目.
我正在尝试使用Xdebug和Webgrind来优化性能.
我已经发现了一些瓶颈,比如解析Ini配置等等.并缓存了它.
现在,我只是意识到自动加载是我的应用程序中成本最高的部分:
Opl\Autoloader\ApcLoader->loadClass 274 31.36 43.86
Zend_Loader_PluginLoader->load 150 4.80 12.29
Zend_Loader_Autoloader->getClassAutoloaders 278 1.42 1.91
Zend_Controller_Router_Route_Regex->_getMappedValues 291 1.29 1.35
Doctrine\ORM\UnitOfWork->createEntity 85 1.24 3.18
Run Code Online (Sandbox Code Playgroud)
正如你我不使用默认的看到Zend_Loader_Autoloader,我使用的Opl是,据我所知,比它更快,我使用的是classMapLoader与APC缓存,但它仍然是一个有点减慢相比,应用程序的其余部分.
我怎么能优化它?
我已经加载了大约250个类,看起来只有~40个很慢,其他人显示0,00为"总呼叫成本",但其他人在要求呼叫时从0,08增加到0,57.
顺便说一句,由于使用Opl自动加载器,它看起来在我的生产环境APC上只有操作码缓存"手动需要"的文件,而不是自动加载器调用的文件.
如果重构代码不是一个选项(放弃 Zend Framework、放弃 Doctrine、放弃...),我会首先优化购买更好的硬件。这将自动优化您的代码,因为代码的上下文只是发生了变化(这并不完全是优化代码,因为代码不会改变)。
如果这不是一个选择,请考虑为自己创建一个构建系统,该系统可以预处理您的代码库并创建它的非开发版本以减少加载过程。这需要分析始终需要哪些文件,并将它们全部编译成加载器优化的格式,可以是单个文件和/或静态类加载器映射。
然而众所周知,Zend 总是需要向内存加载大量数据。即使使用像 APC 这样的 PHP 缓存也可能已经给你带来了一些东西(考虑使用前面提到的构建脚本进行预编译并优化指标突出显示的部分)。
如果您的应用程序结构允许,还有另一种可能性:在请求之间将整个应用程序保留在内存中。这可以通过 PHP 网络服务器来完成。完成后,代码只需要在服务器启动后加载,并且永远不需要再次加载。这只适用于您自己的应用程序(如果它支持多个请求)。为此,可以很容易地采用一个良好的封装应用程序,尤其是具有请求逻辑的应用程序。现有的解决方案是appserver-in-php。与您已经从 APC 获得的好处相比,您会惊讶地发现速度提高了多少。
也许这很有帮助。很难提出任何额外的、更具体的建议,因为不可能看到代码的运行情况,也不可能有详细的指标。您刚刚传递了一些有关幕后发生的事情的片段,因此很难更具体地告诉您。