【问题标题】:Find out where your PHP code is slowing down (Performance Issue)找出您的 PHP 代码在哪里变慢(性能问题)
【发布时间】:2010-09-08 12:23:00
【问题描述】:

这是我在 SO 的第一个问题。

最近有人要求我维护我公司的内部应用程序。这些应用程序是用 PHP 构建的,它的编码相当好(OO、DB Abstraction、Smarty),没有什么 WTF 风格。

问题是应用程序非常慢

如何找出导致应用程序运行速度变慢的原因?我已经优化了代码以进行很少的数据库查询,所以我知道是 PHP 代码需要一段时间才能执行。我需要一些工具来帮助我解决这个问题,并且需要制定一个检查我的代码的策略。

我可以自己完成检查/策略工作,但我需要更多 PHP 工具来确定我的应用程序在哪里出错。

想法?

【问题讨论】:

    标签: php mysql performance profiling


    【解决方案1】:

    我最近在类似的情况下使用过XDebug profiling。它输出一个完整的配置文件报告,可以使用许多常见的分析应用程序读取(虽然不能给你一个列表,我只是使用了 slackware 附带的一个)。

    【讨论】:

      【解决方案2】:

      正如 Juan 所说,xDebug 非常出色。如果您使用的是 Windows,WinCacheGrind 会让您查看报告。

      【讨论】:

      • 我有一台 Windows 机器,可以好好利用
      • KCacheGrind (KDE/Linux) 要好得多。
      【解决方案3】:

      观看 Rasmus Lerdorf(PHP 的创建者)的演示。他介绍了一些很好的例子来测试 PHP 速度和寻找什么,以及一些可以减慢速度的内部结构。 XDebug 是他使用的一种工具。他还提出了一个非常明确的观点,即了解您在使用框架时会付出多大的性能代价。

      视频: http://www.archive.org/details/simple_is_hard

      幻灯片(因为在视频中很难看到): http://talks.php.net/show/drupal08/1

      【讨论】:

        【解决方案4】:

        有许多变量会影响您的应用程序的性能。我建议您不要立即认为 PHP 是问题所在。

        首先,您如何为 PHP 提供服务?您是否尝试过 Apache 或 IIS 本身的基本优化?服务器是否忙于处理其他类型的请求?您是否利用了PHP code accelerator?测试服务器是否是您的瓶颈的一种方法是尝试在另一台服务器上运行应用程序。

        其次,整个应用程序的性能是否缓慢,或者它似乎只影响某些页面?这可以告诉您从哪里开始分析性能。如果整个应用程序很慢,则问题更可能出在底层服务器/平台上,或者是作为每个请求的一部分的全局 SQL 查询(例如,用户身份验证)。

        第三,您提到最小化 SQL 查询的数量,但是优化现有查询呢?如果您使用 MySQL,您是否利用了每个存储系统的各种优势?您是否对最重要的查询运行EXPLAIN 以确保它们被正确索引?这对于访问大表的查询至关重要;数据集越大,您越会注意到索引不佳的影响。幸运的是,有很多文章 such as this one 解释了如何使用 EXPLAIN。

        第四,一个常见的错误是假设您的数据库服务器会自动使用系统可用的所有资源。您应该检查以确保已为数据库应用程序显式分配了足够的资源。例如,在 MySQL 中,您需要为键缓冲区、临时表大小、线程并发性、innodb 缓冲池大小等添加自定义设置(在 my.cnf 文件中)。

        如果您已经仔细检查了以上所有内容,但仍然无法找到瓶颈,那么 Xdebug 之类的代码分析器绝对可以提供帮助。就个人而言,我更喜欢 Zend Studio 分析器,但它可能不是最佳选择,除非您已经在利用 Zend 平台堆栈的其余部分。然而,根据我的经验,PHP 本身是性能缓慢的根本原因是非常罕见的。通常,代码分析器可以帮助您更准确地确定应归咎于哪些数据库查询。

        【讨论】:

        • 你也是对的。我实际上查看了数据库的结尾,它们看起来很好。 Apache 是个问题,但已修复。我也会安装一个操作码缓存程序。但无论如何,分析您的应用程序仍然有助于改进一般编程。
        【解决方案5】:

        您也可以使用APD(高级 PHP 调试器)。

        让它工作起来很容易。

        $ php apd-test.php
        
        $ pprofp -l pprof.SOME_PID
        
        Trace for /Users/martin/develop/php/apd-test/apd-test.php
        Total Elapsed Time = 0.12
        Total System Time  = 0.01
        Total User Time    = 0.07
        
        
                 Real         User        System             secs/    cumm
        %Time (excl/cumm)  (excl/cumm)  (excl/cumm) Calls    call    s/call  Memory Usage Name
        --------------------------------------------------------------------------------------
        71.3 0.06 0.06  0.05 0.05  0.01 0.01  10000  0.0000   0.0000            0 in_array
        27.3 0.02 0.09  0.02 0.07  0.00 0.01  10000  0.0000   0.0000            0 my_test_function
         1.5 0.03 0.03  0.00 0.00  0.00 0.00      1  0.0000   0.0000            0 apd_set_pprof_trace
         0.0 0.00 0.12  0.00 0.07  0.00 0.01      1  0.0000   0.0000            0 main
        

        有一个很好的教程如何编译 APD 并使用它进行分析:http://martinsikora.com/compiling-apd-for-php-54

        【讨论】:

        • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
        • 答案是“使用 APD”。附加链接适用于那些安装有问题的人。
        【解决方案6】:

        phpED (http://www.nusphere.com/products/phped.htm) 还提供了出色的调试和分析功能,以及在 PHP 代码中添加监视、断点等的能力。集成分析器直接提供 IDE 中每个函数调用和类方法的时间分解。浏览器插件还可以与 Firefox 或 IE 快速集成(即用浏览器访问慢速 URL,然后单击按钮进行分析或调试)。

        在指出应用程序运行缓慢的地方以集中大部分编码工作时非常有用;它避免浪费时间优化已经很快的代码。尝试过 Zend 和 Eclipse,我现在被 phpED 的易用性所吸引。

        请记住,在针对 Web 服务器进行调试时,Xdebug 和 phpED(带有 DBG)都需要安装一个额外的 PHP 模块。 phpED 还提供(我未尝试过)本地调试选项。

        【讨论】:

          【解决方案7】:

          Xdebug 配置文件绝对是要走的路。另一个提示 - WincacheGrind 很好,但最近没有更新。 http://code.google.com/p/webgrind/ - 在浏览器中可能是一种简单快捷的选择。

          尽管如此,它仍然是数据库。检查相关索引 - 并且它有足够的内存来缓存尽可能多的工作数据。

          【讨论】:

            【解决方案8】:

            如果它的代码库很大,如果你还没有的话,试试 apc。

            http://pecl.php.net/package/APC

            【讨论】:

            • 你好。如果您回顾了您的问题,您会保持原样吗?但是,您可能知道该怎么做,所以我会让您去做。请包括您的链接的相关部分:)
            【解决方案9】:

            您也可以尝试使用 php.ini 中的 register_tick_function 函数。它告诉 php 在您的代码中定期调用某个函数。然后,您可以跟踪当前正在运行的函数以及调用之间的时间量。然后你可以看到什么是花费最多的时间。 http://www.php.net/register_tick_function

            【讨论】:

              【解决方案10】:

              我们使用 Zend 开发环境(Windows)。昨天,我们通过在运行 Process Explorer 时逐步通过调试器来观察内存/cpu/磁盘活动,从而解决了内存使用峰值问题。

              进程资源管理器:http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx

              ZDE 包含一个基本性能分析器,可以显示页面请求期间每个函数调用所花费的时间。

              【讨论】:

                【解决方案11】:

                我使用PEAR Benchmarklog4php 的组合。

                在我想要分析的脚本顶部,我创建了一个环绕Benchmark_Timer 对象的对象。在整个代码中,我添加了$object->setMarker("name");calls,尤其是在可疑代码周围。

                包装类有一个destroy方法,它获取日志信息并将其写入log4php。我通常将其发送到系统日志(许多服务器,聚合到一台服务器上的一个日志文件)。

                在调试中,我可以查看日志文件并查看需要改进的地方。稍后在生产中,我可以解析日志文件并进行性能分析。

                它不是 xdebug,但它始终处于开启状态,让我能够比较代码的任意两次执行。

                【讨论】:

                • 即使我使用 XDebug,我也会检查 Pear Benchmark。我可以在其他项目中使用它
                【解决方案12】:

                如果您的服务器性能下降是应用程序处理缓慢的原因,您还可以查看HA Proxy 或任何其他负载平衡解决方案。服务器。

                【讨论】:

                  猜你喜欢
                  • 2010-12-07
                  • 2021-11-05
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-07-07
                  • 1970-01-01
                  • 2011-09-07
                  • 2012-08-13
                  相关资源
                  最近更新 更多