首页 > 后端开发 > php教程 > PHP主|与Xdebug进行调试和分析PHP

PHP主|与Xdebug进行调试和分析PHP

William Shakespeare
发布: 2025-02-25 23:30:11
原创
774 人浏览过

Xdebug:PHP开发者的强大调试和性能分析工具

核心要点:

  • Xdebug是一个功能强大、免费且开源的PHP扩展,提供调试支持、堆栈跟踪、性能分析、代码覆盖率等功能。它允许开发者在任何时候暂停应用程序的执行,检查变量的值,从而更好地了解PHP的运行情况。
  • Xdebug可作为PHP应用程序的性能分析工具,记录诸如语句和函数执行时间、调用次数等重要细节。分析这些输出可以了解瓶颈所在,从而优化应用程序以提高性能。
  • 要使用Xdebug,需要正确安装和配置它。XAMPP或MAMP中预装了Xdebug,只需在php.ini中启用即可。对于其他平台,可以通过包管理器安装。需要注意的是,使用其他Zend扩展可能会与Xdebug冲突。

PHP是Web开发中最流行的语言,但过去常有人批评它缺乏合适的调试器。使用Java和C#等语言的开发者可以使用强大的调试工具套件,通常直接集成到他们的IDE中。但Web服务器和PHP IDE的分离性质阻碍了我们使用许多相同的工具。我们手动在代码中添加调试语句……直到Xdebug填补了这个空白。Xdebug是由Derick Rethans创建的免费开源项目,可能是最有用的PHP扩展之一。它提供的不仅仅是基本的调试支持,还包括堆栈跟踪、性能分析、代码覆盖率等等。本文将介绍如何安装和配置Xdebug,如何从Netbeans调试PHP应用程序,以及如何在KCachegrind中读取性能分析报告。

安装和配置Xdebug

如果您使用的是XAMPP或MAMP,则Xdebug已预安装;您只需在php.ini中启用它即可。如果您在Ubuntu等平台上使用基于包的安装,则可以使用类似apt-get install php5-xdebug的命令通过包管理器安装它。我的php.ini中Xdebug的条目如下所示:

<code>[xdebug]
zend_extension="/Applications/MAMP/bin/php5.2/lib/php/extensions/no-debug-non-zts-20060613/xdebug.so"
xdebug.remote_enable=1
xdebug.remote_host=localhost
xdebug.remote_port=9000</code>
登录后复制
登录后复制

zend_extension指定Xdebug模块的路径。xdebug.remote_enable值切换扩展是否处于活动状态。xdebug.remote_host是您的系统名称或IP地址(这里我指定了localhost,因为我都在同一台机器上工作,但是如果需要为您的设置指定不同的值,则该值可以是IP地址或DNS主机名)。xdebug.remote_port是客户端侦听来自Xdebug连接的端口(9000是默认值)。使用Xdebug时,务必确保您没有使用任何其他Zend扩展,因为它们可能会与Xdebug冲突。还有其他安装选项。Xdebug网站提供了一个简单的向导来指导您完成安装过程。您可以获取phpinfo()php –i的输出,将其粘贴到文本框中,让向导分析您的服务器配置,并指导您如何在您的机器上编译Xdebug。

调试

通常情况下,使用var_dump()exit/die()组合进行调试很诱人。但是这种方法的问题在于,您必须修改代码才能进行调试;您必须记住添加输出语句的每个位置,并在调试完成后将其删除。Xdebug通过允许您在任何需要的地方暂停应用程序的执行来克服这个问题。然后,您可以检查该作用域中变量的值,以更好地了解PHP的运行情况。您可以轻松地配置Netbeans充当Xdebug客户端。打开选项窗口(工具>选项),然后转到PHP部分的调试选项卡。输入php.ini中给出的调试端口和会话ID,您需要使用要调试的请求传递会话ID。现在,您可以通过单击工具选项卡中的“调试”来运行调试器。

PHP Master | Debugging and Profiling PHP with Xdebug

打开源文件后,单击工具栏中的“调试”按钮开始调试。它将在浏览器中打开应用程序,如果已在“选项”窗口中启用“在第一行停止”选项,则PHP的执行将暂停在文件的首行。否则,它将运行直到遇到第一个断点。从那里,您可以使用“继续”按钮继续到下一个断点。请注意,浏览器URL栏中的XDEBUG_SESSION_START参数。要触发调试器,必须将XDEBUG_SESSION_START作为请求参数(GET/POST)或XDEBUG_SESSION作为cookie参数传递。调试工具栏中还有一些其他有用的操作。它们是:

  • 单步跳过 – 跳过当前正在执行的行
  • 单步进入 – 单步进入函数(对于非内置函数)
  • 单步跳出 – 跳出当前函数

您可以通过单击编辑器边距中的行号来添加断点,然后在断点处暂停执行。可以通过再次单击它们来删除它们。或者,转到窗口>调试>断点,这将列出程序中的所有断点,您可以选择/取消选择仅您需要的断点。运行时,当前作用域中变量的状态将显示在变量窗口中。它将显示局部变量和超级全局变量(如$_COOKIE$_GET$_POST$_SERVER)的值。您可以观察它们的值在您逐步执行语句时如何变化。

PHP Master | Debugging and Profiling PHP with Xdebug

性能分析

性能分析是优化任何应用程序的第一步。性能分析工具会记录重要的细节,例如语句和函数执行所需的时间、调用次数等等。可以分析输出以了解瓶颈所在。Xdebug也可以用作PHP的性能分析工具。要开始分析您的应用程序,请将以下设置添加到php.ini:

<code>[xdebug]
zend_extension="/Applications/MAMP/bin/php5.2/lib/php/extensions/no-debug-non-zts-20060613/xdebug.so"
xdebug.remote_enable=1
xdebug.remote_host=localhost
xdebug.remote_port=9000</code>
登录后复制
登录后复制

Xdebug中默认情况下禁用性能分析,因此xdebug.profiler_enable用于启用它。xdebug.profiler_output_name是性能分析器日志的文件名(%t说明符将时间戳附加到文件名;有关说明符的完整列表,请参见文档)。Xdebug将性能分析输出存储在xdebug.profiler_output_dir指定的目录中。您可以将其更改为您选择的任何位置,但请记住,运行PHP脚本的用户帐户必须对它具有写入权限。性能分析会降低性能,因为PHP引擎需要查看每个函数调用并记录其详细信息,因此您不希望一直运行它。xdebug.profiler_enable_trigger指示Xdebug仅在将XDEBUG_PROFILE作为GET或POST参数传递时才执行性能分析。Xdebug创建的日志文件的大小可能因应用程序的操作而异。此外,它并不真正易于阅读。您需要使用KCachegrind或Webgrind等程序来查看它们。KCachegrind是KDE的性能分析数据可视化工具,需要Unix环境才能运行,而Webgrind是一个基于Web的工具。在KCachegrind中打开性能分析日志文件将显示从main()开始的每个函数调用的成本。以下是查找阶乘函数的性能分析输出的KCachegrind可视化:

PHP Master | Debugging and Profiling PHP with Xdebug

左侧面板(函数概要)按执行顺序显示每个函数所花费的时间。右上角的面板以图形方式显示相同的信息,大小对应于函数的成本。调用图表示应用程序中函数之间的关系。在此示例中,只有两个函数,main()和fact()。fact()是一个递归函数,在图中用循环表示。优化代码时,应查找总成本最高的区域。通常情况下,I/O操作的成本最高。记住尽可能减少它们。在任何有意义的地方延迟加载文件。假设您有一个名为Orders的类,它将从您的网上商店为您提供所有订单及其详细信息的列表。

<code>xdebug.profiler_enable = 1
xdebug.profiler_output_name = xdebug.out.%t
xdebug.profiler_output_dir = /tmp
xdebug.profiler_enable_trigger = 1</code>
登录后复制

此类具有两种方法:getAll()和getDetails()。当您调用getAll()方法时,它将获取orders表中的所有记录并循环遍历它们以获取所有记录的详细信息。让我们看看性能分析信息。

PHP Master | Debugging and Profiling PHP with Xdebug

尽管绝对数字并不重要,因为它们取决于平台和运行时条件,但您将了解不同函数的相对成本。请注意,某些函数被调用了数百次(这当然很糟糕)。代码不需要循环遍历所有订单并分别获取每个订单的详细信息。让我们重写getAll()函数以使用JOIN。

<?php
class Orders
{
    protected $db;

    public function __construct(PDO $db) {
        $this->db = $db;
    }

    public function getAll() {
        $orders = array();
        $query = "SELECT * FROM orders";
        $result = $this->db->query($query);
        while ($row = $result->fetch(PDO::FETCH_ASSOC)) {
            $row['details'] =
                $this->getDetails($row['orderId']);
            $orders[] = $row;
        }

        return $orders;
    }

    public function getDetails($orderId){
        $details = array();
        $result = $this->db->query("SELECT * FROM orderdetails WHERE orderId = " . $orderId);
        while ($row = $result->fetch(PDO::FETCH_ASSOC)) {
            $details[] = $row;
        }
        return $details;
    }
}
登录后复制

现在性能分析产生了更好的结果,因为查询数量减少了。此外,代码不再调用getDetails()函数了。

PHP Master | Debugging and Profiling PHP with Xdebug

总结

Xdebug充当中间人,控制服务器中PHP程序的执行。在本文中,您已经看到了Xdebug最令人印象深刻的两个特性——调试支持和性能分析支持。它的远程调试允许您在运行时检查值,而无需修改程序,从而更好地了解PHP的运行情况。性能分析有助于发现代码中的瓶颈,以便您可以对其进行优化以提高性能。我希望本文能帮助您了解Xdebug的优势,并鼓励您立即开始使用它(如果您尚未使用)。如果您发现这是一个有价值的工具,您甚至可能想要考虑通过购买支持协议来支持这个伟大的项目。

(请注意:以上图片占位符需要替换为实际截图。)

以上是PHP主|与Xdebug进行调试和分析PHP的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板