Windows 下安装 Xdebug 受难记之(2)

来源:互联网 发布:软件开发成本计算 编辑:程序博客网 时间:2024/04/28 19:54

    于是,转移到另一台安装 Windows Server 2003 + PHP5.2.5 的机器,按照前述的步骤,安装 Xdebug 2.1.0。可以看到 phpinfo 中的 Xdebug 信息了。但运行“php -v”命令,结果如下:

    E:/usr/local/php-5.2.5>php -v
    PHP Warning:  PHP Startup: SVWh: Unable to initialize module
    Module compiled with module API=20020429, debug=0, thread-safety=1
    PHP compiled with module API=20060613, debug=0, thread-safety=1
    These options need to match in Unknown on line 0

    还是有错误,但毕竟 Xdebug 开始工作了。

    一、前文 xdebug.* = On/Off 等配置语句的说明

    参数解释:

    zend_extension
    加载 Xdebug 这个 zend 扩展模块。这里不能用extension=php_xdebug.dll的方式加载,必须要以 zend extension 的方式加载,否则安装上后,phpinfo是显示不出xdebug这个项的。

    xdebug.auto_trace
    自动打开“监测函数调用过程”的功能。该功能可以在你指定的目录中将函数调用的监测信息以文件的形式输出。此配置项的默认值为off。

    xdebug.collect_params
    打开收集“函数参数”的功能。将函数调用的参数值列入函数过程调用的监测信息中。此配置项的默认值为off。

    xdebug.collect_return
    打开收集“函数返回值”的功能。将函数的返回值列入函数过程调用的监测信息中。此配置项的默认值为off。

    xdebug.trace_output_dir
    设定函数调用监测信息的输出文件的路径。

    xdebug.profiler_enable
    打开基准测试器。对应用程序整体范围有效。
    只有在必要时才使用应用程序范围的基准测试特性,因为它向PHP脚本添加了很多额外消耗。基准测试文件还占用很多的磁盘存贮空间。

    xdebug.profiler_output_dir
    设定基准测试信息输出文件的路径。文件中保存了 PHP 脚本执行过程中调用过的函数以及每个函数分别被调用了多少次的信息。

    还有一些更为具体的参数设定,详见 Xdebug 官网:http://www.xdebug.org/docs-settings.php

    二,几个示例,使用 Xdebug 跟踪代码执行

    运行以下 PHP 代码(文件名 xdebug1.php):

    <?php
      class MyClass
      {
        public function myCaller($other)
        {
          $other->myCallee();  //第6行
        }
      }

      class MyOtherClass
      {
        public function myCallee()
        {
          printf("%s", xdebug_call_class());
          printf("::%s", xdebug_call_function());
          printf(" in %s", xdebug_call_file());
          printf(":%s/n", xdebug_call_line());
        }
      }

      $a = new MyClass();
      $b = new MyOtherClass();
      $a->myCaller($b);
    ?>

    输出以下信息:
    MyClass::myCaller in D:/_myPHP5/htdocs/xdebug1.php:6

    注意代码里的以“xdebug_”打头的函数,这是 Xdebug 的扩展函数。因为作为 Zend 扩展(注意 Zend 扩展与 PHP 扩展的不同),Xdebug 已经被加载到 PHP 引擎之中,所以它的函数作为全局函数可以在任何地方调用。以上示例代码的输出信息就是由 Xdebug 函数的输出拼接而成的。

    Xdebug 加载后,所有运行的 PHP 代码的状态信息都被 Xdebug 跟踪和记录了,被保存为 trace.*.xt 文件和 cachegrind.out.* 文件。

    还可以调用 xdebug_get_function_stack() 函数,它会返回到这一点为止的关于函数调用信息的一个数组。这个函数与普通的 PHP 函数 debug_backtrace() 很相似。

    当需要确定某段脚本两点之间调用过的所有函数和方法,就可以使用 Xdebug 函数跟踪功能。这时,需要设定 xdebug.auto_trace = off。

    启动和停止跟踪功能的函数:

    void xdebug_start_trace(string filename [, int options])
    这个函数用来启动跟踪函数调用。filename 表示生成的跟踪文件,应该是物理全路径。options值是一个位掩码值,它允许使用XDEBUG_TRACE_APPEND常量添加跟踪记录文件,使用XDEBUG_TRACE_COMPUTERIZED常量创建计算出的结果的输出格式,甚至可以使用XDEBUG_TRACE_HTML常量创建一个HTML格式的表格跟踪记录。

    void xdebug_stop_trace()
    停止跟踪功能。如果不调用stop函数,跟踪功能将在执行过程结束时自动停止。

    示例代码,跟踪对象的方法调用:

    xdebug_start_trace(dirname(__FILE__) . '/trace');
    $a->myCaller($b);
    xdebug_stop_trace();

    这个例子会在当前路径下生成 trace.xt 跟踪记录文件。

    三、查看跟踪记录文件和应用程序范围的基准测试文件

    跟踪记录文件比较容易阅读和理解,例如:

    TRACE START [2010-07-06 19:31:48]
        0.0019      67608   -> {main}() D:/_myPHP5/htdocs/xdebug1.php:0
        0.0021      68296     -> MyClass->myCaller(class MyOtherClass) D:/_myPHP5/htdocs/xdebug1.php:23
        0.0022      68464       -> MyOtherClass->myCallee() D:/_myPHP5/htdocs/xdebug1.php:6
        0.0022      68720         -> xdebug_call_class() D:/_myPHP5/htdocs/xdebug1.php:14
                                   >=> 'MyClass'
        0.0024      68776         -> printf(string(2), string(7)) D:/_myPHP5/htdocs/xdebug1.php:14
                                   >=> 7
        …………        …………           …………
                                   >=> 6
        0.0032      69120         -> printf(string(4), long) D:/_myPHP5/htdocs/xdebug1.php:17
                                   >=> 3
                                 >=> NULL
                               >=> NULL
                             >=> 1
        0.0118 zu
    TRACE END   [2010-07-06 19:31:48]

    但基准测试文件 cachegrind.out.* 就不同了,它的数据表示晦涩难懂,判若天书,例如:

    version: 0.9.6
    cmd: D:/_myPHP5/htdocs/xdebug1.php
    part: 1

    events: Time

    fl=php:internal
    fn=php::xdebug_call_class
    14 5
    ……

    fl=D:/_myPHP5/htdocs/xdebug1.php
    fn=MyOtherClass->myCallee
    6 146469
    cfn=php::xdebug_call_class
    calls=1 0 0
    14 5
    ……

    fl=D:/_myPHP5/htdocs/xdebug1.php
    fn=MyClass->myCaller
    23 357
    cfn=MyOtherClass->myCallee
    calls=1 0 0
    6 161702

    fl=D:/_myPHP5/htdocs/xdebug1.php
    fn={main}

    summary: 309298

    0 147238
    cfn=MyClass->myCaller
    calls=1 0 0
    23 162060

    由于基准测试文件 cachegrind.out.* 的内容不易理解,所以我们需要一个工具来读取它。Windows 下有一款这样的软件:WinCacheGrind。

    WinCacheGrind 可以到 http://sourceforge.net/projects/wincachegrind/ 下载安装。WinCacheGrind 是个绿色软件,可以直接双击运行。截至2010年8月份,其最后版本是 10.0.0.14,最后发行年份是2005年。

    运行 WinCacheGrind 后,点击 Tools->options,设定你的 Working folder(php.ini里xdebug.profiler_output_dir的值)。这样就可以比较直观的查看基准测试文件的信息了。这些信息包括函数执行的时间、被调用的次数等等细节,便于我们分析代码的性能。

    另外,还可以使用另一个工具软件 Webgrind 来查看和分析数据。看看名字就会猜到,Webgrind 是一个 Web 程序。它是用 PHP 编写的,可以部署在网站上,不用每台客户端都安装软件,方便多了。

    可以从 Webgrind 官网 http://code.google.com/p/webgrind/ 下载,然后解压部署在 Web 目录下,配置一下 config.php 文件,指定存储输出数据的目录,就可以运行了。

    配置好 Xdebug 后,PHP 页面的出错信息更人性化了,在页面里以表格的形式体现。

    作者:张庆(网眼) 西安 PHP 教育培训中心 2010-7-7
    来自“网眼视界”:http://blog.why100000.com
    作者微博:http://t.qq.com/zhangking
    “十万个为什么”电脑学习网:http://www.why100000.com