热门关键字:  ubuntu  分区  函数  Fedora  linux系统进程

当前位置 :| 主页>Linux教程>编程开发>PHP>

用 Xdebug 修正 PHP 应用程序中的错误

来源: 作者: 时间:2007-11-12 Tag: 点击:


图 1. 检验 Xdebug 扩展是否已经安装并运行
Xdebug 扩展已启用

注:如果您在 phpinfo() 的输出中没有看到 Xdebug 部分,则 Xdebug 装入失败。Apache 错误日志会列出原因。常见错误包括 zend_extension 的路径错误或者与其他扩展发生冲突。例如,如果需要使用 XCache 和 Xdebug,一定要先装入 XCache。但是,由于 Xdebug 适于在开发时使用并假定 xdebug.so 的路径正确,因此需要禁用其他扩展并重试。然后您可以重新启用扩展以执行其他测试,如缓存的效果。Xdebug 站点还有其他一些故障检修技巧。







配置 Xdebug

指令(图 1 中大表的最左侧一列)是一些可以设定的参数,用于改变 Xdebug 扩展的行为。可在 php.ini 文件中设置所有指令。一些指令用于配置调试工具;其他指令用于调整分析器的操作。忽略后者,让我们用一些合理设置来配置 Xdebug 以帮助调试 PHP 代码。

限制递归

如果应用程序使用递归 —— 例如,计算斐波纳契数列 —— 并且终端环境不正确,应用程序会运行很长一段时间后才用尽内存或超时。您可以设定 xdebug.max_nesting_level 参数来限定递归深度。例如,xdebug.max_nesting_level = 50 将把递归深度限定为 50 次嵌套调用,然后将强制终止应用程序。下面演示一下,在启用 Xdebug 的状态下运行下列代码:


清单 2. 限制递归
                
<?php
    function deep_end( ) {
        deep_end();
    }
    
    deep_end();
?>

函数 deep_end() 将逐行进行到最底部。Xdebug 将在 49 次函数调用后介入并得到图 2(顺便说一句,main() 的初始调用用于启动程序计数作为第 1 次调用)。


图 2. 如果调用堆栈超出限制,Xdebug 将终止执行
递归次数过多

如果应用程序大量使用递归隔离并解决较大的问题,则需要把深度相应地设定得 “更低”。否则,将 xdebug.max_nesting_level 设为较小的值,这样可以更快速地捕捉失控的函数调用序列。

回答四个 w 问题

出错时,您需要回答四个 w 问题。Xdebug 可以立即提供所有这些信息。下面是一些有益的初始设置;您可以随时调整这些设置。


清单 3. 错误
                
xdebug.dump_once = On
xdebug.dump_globals = On
xdebug.dump_undefined = On
xdebug.dump.SERVER = REQUEST_METHOD,REQUEST_URI,HTTP_USER_AGENT
xdebug.dump.REQUEST=*

xdebug.show_exception_trace = On
xdebug.show_local_vars = 1
xdebug.var_display_max_depth = 6

xdebug.dump_oncexdebug.dump_globalsxdebug.dump_undefinedxdebug.dump_SUPERGLOBAL 设置(其中 SUPERGLOBAL 可以是 COOKIEFILESGETPOSTREQUESTSERVERSESSION)用于控制哪些 PHP 超全局变量将被包含在所有诊断结果中。

xdebug.dump_globals 设为 On 以转储名为 xdebug.dump_SUPERGLOBAL 设置中的超全局变量。例如,xdebug.dump_SERVER = REQUEST_METHOD,REQUEST_URI,HTTP_USER_AGENT 将打印 PHP 超全局变量 $_SERVER['REQUEST_METHOD']$_SERVER['REQUEST_URI']$_SERVER['HTTP_USER_AGENT']。如果需要打印超全局变量数组中的所有值,请使用星号 (*),例如 xdebug.dump_REQUEST=*。如果进一步将 xdebug.dump_undefined 设为 On 并且不设定指定的超全局变量,则仍用值 undefined 打印变量。

即使捕捉到异常,代码行 xdebug.show_exception_trace = On 仍将强制执行异常跟踪。代码行 xdebug.show_local_vars = 1 将打印每个函数调用的最外围中的所有局部变量,包括尚未初始化的变量。而 xdebug.var_display_max_depth = 6 表示转储复杂变量的深度。

整合

清单 4 显示了 php.ini 文件的 Xdebug 的所有相关设置。


清单 4. php.ini 文件的设置
                
zend_extension = /usr/lib/php4/20020429/xdebug.so
xdebug.default_enable = On
xdebug.show_exception_trace = On
xdebug.show_local_vars = 1
xdebug.max_nesting_level = 50
xdebug.var_display_max_depth = 6

xdebug.dump_once = On
xdebug.dump_globals = On
xdebug.dump_undefined = On
xdebug.dump.REQUEST = *
xdebug.dump.SERVER = REQUEST_METHOD,REQUEST_URI,HTTP_USER_AGENT

将这些设置(或类似的内容)保存到 php.ini 文件中,然后重新启动 Web 服务器。




 


解释转储报告

以下示例显示了出错时发生的情况。把您的 “有待改进” 的代码修改为类似清单 5 所示的代码。


清单 5. 修改错误代码
                
<?php
    function deep_end( $count ) {
        // add one to the frame count
        $count += 1;

        if ( $count < 48 ) {
                deep_end( $count );
        }
        else {
                trigger_error( "going off the deep end!" );
        }
    }

    // main() is called to start the program, 
    // so the call stack begins with one frame
    deep_end( 1 );
?>

如果运行这段新代码,您应当会看到大量信息,如下所示:


图 3. 出错时超全局变量、堆栈和局部变量的转储
出错时超全局变量、堆栈和局部变量的转储

传递给 trigger_error 的消息文本显示在顶部。底部是受请求的 $_SERVER 元素列表和已经定义的 $_REQUEST 元素列表。最底部是 #48 范围中的变量列表,这是根据清单对 deep_end() 进行的调用。在调用中,$count 是整数 48。当此 Xdebug 配置就绪后,您现在有更多的线索可以跟踪犯罪者。

下面是另外一个技巧:Xdebug 提供了一个增强型 var_dump() 函数,它对于 PHP 数组和类尤为有帮助。例如,清单 6 显示了简单的(PHP V4)类和实例。


清单 6. PHP V4 类和实例
                
<?php
    class Person {
        var $name;
        var $surname;
        var $age;
        var $children = array();

        function Person( $name, $surname, $age, $children = null) {
            $this->name = $name;
            $this->surname = $surname;
            $this->age = $age;
            foreach ( $children as $child ) {
                $this->children[] = $child;
            }
        }
    }   

    $boy = new Person( 'Joe', 'Smith', 4 );
    $girl = new Person( 'Jane', 'Smith', 6 );
    $mom = new Person( 'Mary', 'Smith', 34, array( $boy, $girl ) );

    var_dump( $boy, $mom );
?>

最新评论共有 4 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名: 密码:
匿名?
注册