PHP获取函数所有调用栈(debug_backtrace)

应用场景

有的时候调试框架业务代码,尤其是框架代码,非常麻烦,你从入口文件开始调试,可能要跑几十个文件才能到达你最后书写逻辑的控制器,流程类似
A->B->C->D->E->F->G->H->I->J->K (K代表最终执行的控制器方法)
那我就快速知道是哪个地方调用了K方法,K的上级调用栈有哪些,就可以使用debug_backtrace,以Laravel框架为例,打开debug_backtrace(2)以后,可以看到上级调用栈有43个,具体是从从哪一行的哪个方法调用类进来的一目了然,也方便调试

函数原型

debug_backtrace ( int $options = DEBUG_BACKTRACE_PROVIDE_OBJECT , int $limit = 0 ) : array
// debug_backtrace() 产生一条 PHP 的回溯跟踪(backtrace)。
debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS) 等同于 `debug_backtrace(2)`

这个函数有俩参数
截至 5.3.6,这个参数是以下选项的位掩码:

  • options
    • DEBUG_BACKTRACE_PROVIDE_OBJECT 是否填充 “object” 的索引。
    • DEBUG_BACKTRACE_IGNORE_ARGS 是否忽略 “args” 的索引,包括所有的 function/method 的参数,能够节省内存开销。在 5.3.6 之前,仅仅能使用的值是 true 或者 false,分别等于是否设置 DEBUG_BACKTRACE_PROVIDE_OBJECT 选项。
  • limit
    • 截至 5.4.0,这个参数能够用于限制返回堆栈帧的数量。 默认为 (limit=0) ,返回所有的堆栈帧。

示例

下面以Laravel框架为例,我在IndexController中打印了一下这个方法,由此可以找到在IndexController之前的所有调用链路,也便于快速排查问题

Array
(
    [0] => Array
        (
            [function] => index
            [class] => App\Http\Controllers\IndexController
            [type] => ->
        )

    [1] => Array
        (
            [file] => C:\phpstudy\WWW\laravel\vendor\laravel\framework\src\Illuminate\Routing\Controller.php
            [line] => 54
            [function] => call_user_func_array
        )

    [2] => Array
        (
            [file] => C:\phpstudy\WWW\laravel\vendor\laravel\framework\src\Illuminate\Routing\ControllerDispatcher.php
            [line] => 45
            [function] => callAction
            [class] => Illuminate\Routing\Controller
            [type] => ->
        )

    [3] => Array
        (
            [file] => C:\phpstudy\WWW\laravel\vendor\laravel\framework\src\Illuminate\Routing\Route.php
            [line] => 239
            [function] => dispatch
            [class] => Illuminate\Routing\ControllerDispatcher
            [type] => ->
        )

    [4] => Array
        (
            [file] => C:\phpstudy\WWW\laravel\vendor\laravel\framework\src\Illuminate\Routing\Route.php
            [line] => 196
            [function] => runController
            [class] => Illuminate\Routing\Route
            [type] => ->
        )

    [5] => Array
        (
            [file] => C:\phpstudy\WWW\laravel\vendor\laravel\framework\src\Illuminate\Routing\Router.php
            [line] => 685
            [function] => run
            [class] => Illuminate\Routing\Route
            [type] => ->
        )

    [6] => Array
        (
            [file] => C:\phpstudy\WWW\laravel\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php
            [line] => 128
            [function] => Illuminate\Routing\{closure}
            [class] => Illuminate\Routing\Router
            [type] => ->
        )

    [7] => Array
        (
            [file] => C:\phpstudy\WWW\laravel\vendor\laravel\framework\src\Illuminate\Routing\Middleware\SubstituteBindings.php
            [line] => 41
            [function] => Illuminate\Pipeline\{closure}
            [class] => Illuminate\Pipeline\Pipeline
            [type] => ->
        )

    [8] => Array
        (
            [file] => C:\phpstudy\WWW\laravel\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php
            [line] => 167
            [function] => handle
            [class] => Illuminate\Routing\Middleware\SubstituteBindings
            [type] => ->
        )

    [9] => Array
        (
            [file] => C:\phpstudy\WWW\laravel\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\VerifyCsrfToken.php
            [line] => 77
            [function] => Illuminate\Pipeline\{closure}
            [class] => Illuminate\Pipeline\Pipeline
            [type] => ->
        )

    [10] => Array
        (
            [file] => C:\phpstudy\WWW\laravel\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php
            [line] => 167
            [function] => handle
            [class] => Illuminate\Foundation\Http\Middleware\VerifyCsrfToken
            [type] => ->
        )

    [11] => Array
        (
            [file] => C:\phpstudy\WWW\laravel\vendor\laravel\framework\src\Illuminate\View\Middleware\ShareErrorsFromSession.php
            [line] => 49
            [function] => Illuminate\Pipeline\{closure}
            [class] => Illuminate\Pipeline\Pipeline
            [type] => ->
        )

    [12] => Array
        (
            [file] => C:\phpstudy\WWW\laravel\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php
            [line] => 167
            [function] => handle
            [class] => Illuminate\View\Middleware\ShareErrorsFromSession
            [type] => ->
        )

    [13] => Array
        (
            [file] => C:\phpstudy\WWW\laravel\vendor\laravel\framework\src\Illuminate\Session\Middleware\StartSession.php
            [line] => 116
            [function] => Illuminate\Pipeline\{closure}
            [class] => Illuminate\Pipeline\Pipeline
            [type] => ->
        )

    [14] => Array
        (
            [file] => C:\phpstudy\WWW\laravel\vendor\laravel\framework\src\Illuminate\Session\Middleware\StartSession.php
            [line] => 62
            [function] => handleStatefulRequest
            [class] => Illuminate\Session\Middleware\StartSession
            [type] => ->
        )

    [15] => Array
        (
            [file] => C:\phpstudy\WWW\laravel\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php
            [line] => 167
            [function] => handle
            [class] => Illuminate\Session\Middleware\StartSession
            [type] => ->
        )

    [16] => Array
        (
            [file] => C:\phpstudy\WWW\laravel\vendor\laravel\framework\src\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse.php
            [line] => 37
            [function] => Illuminate\Pipeline\{closure}
            [class] => Illuminate\Pipeline\Pipeline
            [type] => ->
        )

    [17] => Array
        (
            [file] => C:\phpstudy\WWW\laravel\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php
            [line] => 167
            [function] => handle
            [class] => Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse
            [type] => ->
        )

    [18] => Array
        (
            [file] => C:\phpstudy\WWW\laravel\vendor\laravel\framework\src\Illuminate\Cookie\Middleware\EncryptCookies.php
            [line] => 67
            [function] => Illuminate\Pipeline\{closure}
            [class] => Illuminate\Pipeline\Pipeline
            [type] => ->
        )

    [19] => Array
        (
            [file] => C:\phpstudy\WWW\laravel\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php
            [line] => 167
            [function] => handle
            [class] => Illuminate\Cookie\Middleware\EncryptCookies
            [type] => ->
        )

    [20] => Array
        (
            [file] => C:\phpstudy\WWW\laravel\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php
            [line] => 103
            [function] => Illuminate\Pipeline\{closure}
            [class] => Illuminate\Pipeline\Pipeline
            [type] => ->
        )

    [21] => Array
        (
            [file] => C:\phpstudy\WWW\laravel\vendor\laravel\framework\src\Illuminate\Routing\Router.php
            [line] => 687
            [function] => then
            [class] => Illuminate\Pipeline\Pipeline
            [type] => ->
        )

    [22] => Array
        (
            [file] => C:\phpstudy\WWW\laravel\vendor\laravel\framework\src\Illuminate\Routing\Router.php
            [line] => 662
            [function] => runRouteWithinStack
            [class] => Illuminate\Routing\Router
            [type] => ->
        )

    [23] => Array
        (
            [file] => C:\phpstudy\WWW\laravel\vendor\laravel\framework\src\Illuminate\Routing\Router.php
            [line] => 628
            [function] => runRoute
            [class] => Illuminate\Routing\Router
            [type] => ->
        )

    [24] => Array
        (
            [file] => C:\phpstudy\WWW\laravel\vendor\laravel\framework\src\Illuminate\Routing\Router.php
            [line] => 617
            [function] => dispatchToRoute
            [class] => Illuminate\Routing\Router
            [type] => ->
        )

    [25] => Array
        (
            [file] => C:\phpstudy\WWW\laravel\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php
            [line] => 165
            [function] => dispatch
            [class] => Illuminate\Routing\Router
            [type] => ->
        )

    [26] => Array
        (
            [file] => C:\phpstudy\WWW\laravel\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php
            [line] => 128
            [function] => Illuminate\Foundation\Http\{closure}
            [class] => Illuminate\Foundation\Http\Kernel
            [type] => ->
        )

    [27] => Array
        (
            [file] => C:\phpstudy\WWW\laravel\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\TransformsRequest.php
            [line] => 21
            [function] => Illuminate\Pipeline\{closure}
            [class] => Illuminate\Pipeline\Pipeline
            [type] => ->
        )

    [28] => Array
        (
            [file] => C:\phpstudy\WWW\laravel\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php
            [line] => 167
            [function] => handle
            [class] => Illuminate\Foundation\Http\Middleware\TransformsRequest
            [type] => ->
        )

    [29] => Array
        (
            [file] => C:\phpstudy\WWW\laravel\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\TransformsRequest.php
            [line] => 21
            [function] => Illuminate\Pipeline\{closure}
            [class] => Illuminate\Pipeline\Pipeline
            [type] => ->
        )

    [30] => Array
        (
            [file] => C:\phpstudy\WWW\laravel\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php
            [line] => 167
            [function] => handle
            [class] => Illuminate\Foundation\Http\Middleware\TransformsRequest
            [type] => ->
        )

    [31] => Array
        (
            [file] => C:\phpstudy\WWW\laravel\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\ValidatePostSize.php
            [line] => 27
            [function] => Illuminate\Pipeline\{closure}
            [class] => Illuminate\Pipeline\Pipeline
            [type] => ->
        )

    [32] => Array
        (
            [file] => C:\phpstudy\WWW\laravel\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php
            [line] => 167
            [function] => handle
            [class] => Illuminate\Foundation\Http\Middleware\ValidatePostSize
            [type] => ->
        )

    [33] => Array
        (
            [file] => C:\phpstudy\WWW\laravel\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode.php
            [line] => 63
            [function] => Illuminate\Pipeline\{closure}
            [class] => Illuminate\Pipeline\Pipeline
            [type] => ->
        )

    [34] => Array
        (
            [file] => C:\phpstudy\WWW\laravel\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php
            [line] => 167
            [function] => handle
            [class] => Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode
            [type] => ->
        )

    [35] => Array
        (
            [file] => C:\phpstudy\WWW\laravel\vendor\fruitcake\laravel-cors\src\HandleCors.php
            [line] => 37
            [function] => Illuminate\Pipeline\{closure}
            [class] => Illuminate\Pipeline\Pipeline
            [type] => ->
        )

    [36] => Array
        (
            [file] => C:\phpstudy\WWW\laravel\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php
            [line] => 167
            [function] => handle
            [class] => Fruitcake\Cors\HandleCors
            [type] => ->
        )

    [37] => Array
        (
            [file] => C:\phpstudy\WWW\laravel\vendor\fideloper\proxy\src\TrustProxies.php
            [line] => 57
            [function] => Illuminate\Pipeline\{closure}
            [class] => Illuminate\Pipeline\Pipeline
            [type] => ->
        )

    [38] => Array
        (
            [file] => C:\phpstudy\WWW\laravel\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php
            [line] => 167
            [function] => handle
            [class] => Fideloper\Proxy\TrustProxies
            [type] => ->
        )

    [39] => Array
        (
            [file] => C:\phpstudy\WWW\laravel\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php
            [line] => 103
            [function] => Illuminate\Pipeline\{closure}
            [class] => Illuminate\Pipeline\Pipeline
            [type] => ->
        )

    [40] => Array
        (
            [file] => C:\phpstudy\WWW\laravel\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php
            [line] => 140
            [function] => then
            [class] => Illuminate\Pipeline\Pipeline
            [type] => ->
        )

    [41] => Array
        (
            [file] => C:\phpstudy\WWW\laravel\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php
            [line] => 109
            [function] => sendRequestThroughRouter
            [class] => Illuminate\Foundation\Http\Kernel
            [type] => ->
        )

    [42] => Array
        (
            [file] => C:\phpstudy\WWW\laravel\public\index.php
            [line] => 55
            [function] => handle
            [class] => Illuminate\Foundation\Http\Kernel
            [type] => ->
        )

    [43] => Array
        (
            [file] => C:\phpstudy\WWW\laravel\server.php
            [line] => 21
            [args] => Array
                (
                    [0] => C:\phpstudy\WWW\laravel\public\index.php
                )

            [function] => require_once
        )

)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值