优化我的表现

时间:2011-12-19 10:20:09

标签: php performance zend-framework optimization autoloader

我正在开发一个包含Zend Framework 1.11,Doctrine 2,一些Symfony 2组件和其他工具的项目。库。

我正在尝试使用Xdebug& amp;来优化性能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

正如您所看到的,我没有使用默认Zend_Loader_Autoloader,我正在使用Opl,据我所知,这比我更快,我正在使用classMapLoader使用APC缓存但与应用程序的其余部分相比仍然有点慢。

我该如何优化呢?

我已经加载了大约250个类,看起来只有~40个很慢,其他人显示0,00为“总呼叫成本”,但其他人在需要呼叫时从0,08增加到0,57。 / p>

顺便说一句,由于使用Opl自动加载器,它看起来在我的生产环境APC上只有操作码缓存“手动需要”的文件,而不是自动加载器调用的文件。

4 个答案:

答案 0 :(得分:4)

如果重构代码不是一个选项(删除Zend Framework,Drop Doctrine,Drop ...),我会首先优化购买更好的硬件。这将自动优化您的代码,因为代码的上下文只是被移位(这不是完全优化代码,因为代码不会改变)。

如果这不是一个选项,请考虑创建一个构建系统,该系统可以预处理您的代码库并创建它的非开发版本以减少加载过程。这需要分析总是需要哪些文件,然后将它们全部编译成加载器优化的格式,可以是单个文件和/或静态类加载器映射。

然而,众所周知,Zend总是需要大量加载到内存中。即使使用像APC这样的PHP缓存也可能已经为您带来了一些东西(考虑使用前面提到的构建脚本进行预编译并优化指标突出显示的部分)。

如果您的应用程序结构允许,还有另一种可能性:在请求之间将整个应用程序保留在内存中。这可以通过PHP Web服务器完成。完成后,代码只需要在服务器启动后加载,并且永远不需要再次加载。这仅适用于您自己的应用程序,如果它支持多个请求。一个好的封装应用程序,尤其是请求逻辑,可以很容易地采用。现有解决方案是appserver-in-php。与您从APC获得的好处相比,您会惊讶地发现速度有多快。

也许这很有帮助。由于无法查看您的代码并且无法获得详细的指标,因此很难提出任何其他更具体的建议。你刚刚传递了一个关于幕后内容的片段,所以很难具体地告诉你。

答案 1 :(得分:3)

  

我正在尝试使用Xdebug& amp;来优化性能Webgrind

好的,既然你处在一个需要更好性能的位置,那么你可能会接受一种不那么受欢迎但却明显有效的方法。

它适用于任何语言,只要有一个可以暂停的调试器,比如Xdebug。

这里描述in a nutshellHere's one demonstration of its effectiveness. 我可以链接你更多。

你可能会发现它有点智力上的痛苦。如在

  1. 你发现与常规相关的“瓶颈”。最有价值的加速机会通常不会表现出来。它们是您在看到它们时可以轻松描述的活动,但它们是分散的。他们没有在任何特定的例行程序或代码行中集中大量时间,因此分析人员看不到它们。

  2. 最大的加速机会可能根本不容易解决。他们可能需要重新考虑该计划的组织方式。如果你找到一些你可以轻松修复的东西,这很棒。来吧,做吧。如果不是那么容易修复,但仍然会节省很多时间,如果你需要节省那个时间,那么你必须这样做,不管你喜欢与否。

  3. 祝你好运。

答案 2 :(得分:1)

我不喜欢hakre的建议。首先,我会看看是否可以删除Web服务器。如果是这样,一个好的替代品是nginx或lighttpd。与Apache相比,它们来自本世纪,配置也更容易。关于自动加载我真的不知道,但如果类文件真的很大,你试图安装ram磁盘或使用php压缩器?根据我的经验,PHP压缩器可以显着缩短执行时间(即解析时间)。

答案 3 :(得分:0)

我没有太多经验,但一旦遇到这样的问题。我检查了我的包含路径,并按最大使用库路径的顺序求助它们。我有近30%的提升。我想你已经知道但是已经发布了.......:)