最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • PHP打印跟踪调试信息

    正文概述 转载于:掘金(硬核项目经理)   2021-04-08   743

    对于大部分编译型语言来说,比如 C 、 Java 、 C# ,我们都能很方便地进行断点调试,但是 php 则必须安装 XDebug 并且在编辑器中进行复杂的配置才能实现断点调试的能力。不过,如果只是简单的调试并且查看堆栈回溯的话,其实 PHP 已经为我们准备好了两个函数,能够让我们非常方便的看到程序运行时的调用情况。

    debug_backtrace()

    从这个方法的字面意思上就可以看出,它的意思就是调试回溯,返回的也正是一段回溯信息的数组。

    function a_test($str)
    {
        echo "Hi: $str", PHP_EOL;
        var_dump(debug_backtrace());
    }
    
    var_dump(debug_backtrace());
    
    a_test("A");
    
    // Hi: A/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟踪调试信息.php:7:
    // array(1) {
    //   [0] =>
    //   array(4) {
    //     'file' =>
    //     string(93) "/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟踪调试信息.php"
    //     'line' =>
    //     int(12)
    //     'function' =>
    //     string(6) "a_test"
    //     'args' =>
    //     array(1) {
    //       [0] =>
    //       string(1) "A"
    //     }
    //   }
    // }
    

    这个方法必须在函数中调用,在函数方法外部使用是不会有内容的。从内容中看,它输出了关于这个函数的 __FILE__ 、 __LINE__ 、 __FUNCTION__ 、$argv 等信息。其实就是关于当前打印这行所在函数的相关内容。

    我们当然也可以多嵌套几层函数来看一下打印出的内容是什么。

    function b_test(){
        c_test();
    }
    
    function c_test(){
        a_test("b -> c -> a");
    }
    
    b_test();
    
    // Hi: b -> c -> a
    // /Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟踪调试信息.php:7:
    // array(3) {
    //   [0] =>
    //   array(4) {
    //     'file' =>
    //     string(93) "/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟踪调试信息.php"
    //     'line' =>
    //     int(37)
    //     'function' =>
    //     string(6) "a_test"
    //     'args' =>
    //     array(1) {
    //       [0] =>
    //       string(11) "b -> c -> a"
    //     }
    //   }
    //   [1] =>
    //   array(4) {
    //     'file' =>
    //     string(93) "/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟踪调试信息.php"
    //     'line' =>
    //     int(33)
    //     'function' =>
    //     string(6) "c_test"
    //     'args' =>
    //     array(0) {
    //     }
    //   }
    //   [2] =>
    //   array(4) {
    //     'file' =>
    //     string(93) "/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟踪调试信息.php"
    //     'line' =>
    //     int(40)
    //     'function' =>
    //     string(6) "b_test"
    //     'args' =>
    //     array(0) {
    //     }
    //   }
    // }
    

    没错,数组的输出顺序就是一个栈的执行顺序,b_test() 最先调用,所以它在栈底,对应的输出也就是数组中的最后一个元素。

    在类中也是类似的使用方法。

    class A{
        function test_a(){
            $this->test_b();
        }
        function test_b(){
            var_dump(debug_backtrace());
        }
    }
    
    $a = new A();
    $a->test_a();
    
    // /Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟踪调试信息.php:90:
    // array(2) {
    //   [0] =>
    //   array(7) {
    //     'file' =>
    //     string(93) "/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟踪调试信息.php"
    //     'line' =>
    //     int(87)
    //     'function' =>
    //     string(6) "test_b"
    //     'class' =>
    //     string(1) "A"
    //     'object' =>
    //     class A#1 (0) {
    //     }
    //     'type' =>
    //     string(2) "->"
    //     'args' =>
    //     array(0) {
    //     }
    //   }
    //   [1] =>
    //   array(7) {
    //     'file' =>
    //     string(93) "/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟踪调试信息.php"
    //     'line' =>
    //     int(95)
    //     'function' =>
    //     string(6) "test_a"
    //     'class' =>
    //     string(1) "A"
    //     'object' =>
    //     class A#1 (0) {
    //     }
    //     'type' =>
    //     string(2) "->"
    //     'args' =>
    //     array(0) {
    //     }
    //   }
    // }
    

    在类中使用的时候,在数组项中会多出一个 object 字段,显示的是这个方法所在类的信息。

    debug_backtrace() 的函数声明是:

    debug_backtrace ([ int $options = DEBUG_BACKTRACE_PROVIDE_OBJECT [, int $limit = 0 ]] ) : array
    

    其中 \options是有两个常量可以定义,DEBUGBACKTRACEPROVIDEOBJECT表明是否填充"object"的索引;DEBUGBACKTRACEIGNOREARGS是否忽略"args"的索引,包括所有的function/method的参数,能够节省内存开销。options 是有两个常量可以定义,DEBUG_BACKTRACE_PROVIDE_OBJECT 表明是否填充 "object" 的索引;DEBUG_BACKTRACE_IGNORE_ARGS 是否忽略 "args" 的索引,包括所有的 function/method 的参数,能够节省内存开销。 options是有两个常量可以定义,DEBUGB​ACKTRACEP​ROVIDEO​BJECT表明是否填充"object"的索引;DEBUGB​ACKTRACEI​GNOREA​RGS是否忽略"args"的索引,包括所有的function/method的参数,能够节省内存开销。limits 可用于限制返回堆栈帧的数量,默认为0返回所有的堆栈。

    debug_backtrace() 以及下面要介绍的 debug_print_backtrace() 方法都是支持 require/include 文件以及 eval() 中的代码的,在嵌入文件时,会输出嵌入文件的路径,这个大家可以自行尝试。

    debug_print_backtrace()

    这个方法从名称也可以看出,它会直接打印回溯内容,它的函数声明和 debug_backtrace() 是一样的,不过 $options 默认是 DEBUG_BACKTRACE_IGNORE_ARGS ,也就是说,它只打印调用所在文件及行数。

    function a() {
        b();
    }
    
    function b() {
        c();
    }
    
    function c(){
        debug_print_backtrace();
    }
    
    a();
    
    #0  c() called at [/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟踪调试信息.php:144]
    #1  b() called at [/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟踪调试信息.php:140]
    #2  a() called at [/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202004/source/PHP打印跟踪调试信息.php:151]
    

    另外就是这个函数不需要使用 var_dump() 或 print_r() 进行输出,直接使用这个函数就会进行输出。能够非常快捷方便的让我们进行调试,比如在 laravel 这类大型框架中,我们在控制器需要查看堆栈信息时,就可以使用 debug_print_backtrace() 快速地查看当前的堆栈调用情况。而 debug_backtrace() 如果没有指定 $options 的话,则会占用非常大的内存容量或者无法完整显示。

    总结

    今天介绍的这两个函数能够灵活地帮助我们调试代码或者了解一个框架的调用情况。当然,在正式的情况下还是推荐使用 Xdebug 加上编辑器的支持来进行断点调试,因为使用 debug_backtrace() 这两个方法我们无法看到变量的变化情况。

    测试代码:

    github.com/zhangyue050…

    参考文档: www.php.net/manual/zh/f… www.php.net/manual/zh/f…


    起源地下载网 » PHP打印跟踪调试信息

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元