debug_backtrace()在php中到底是怎么工作的?

yk9xbfzb  于 2023-02-11  发布在  PHP
关注(0)|答案(2)|浏览(118)

在我的一个PHP项目中,我在代码文件的开头得到了一个函数debug_backtrace(),即<?php debug_backtrace() || die ("Direct access not permitted"); ?>
虽然研究它,我得到了一些解释,它的工作原理是:
调试Drupal网站中的PHP问题可以是简单快捷的,也可以是问题严重的。PHP包含一个名为debug_backtrace的调试函数,它会打印出调用backtrace函数的代码链。
当我将var_dump()debug_backtrace()结合使用时,得到了以下结果:

array(2) {
  [0]=>
  array(3) {
    ["file"]=>
    string(61) "C:\xampp\htdocs\folder_name\templates\default\models\home.php"
    ["line"]=>
    int(30)
    ["function"]=>
    string(7) "include"
  }
  [1]=>
  array(4) {
    ["file"]=>
    string(37) "C:\xampp\htdocs\folder_name\index.php"
    ["line"]=>
    int(146)
    ["args"]=>
    array(1) {
      [0]=>
      string(61) "C:\xampp\htdocs\folder_name\templates\default\models\home.php"
    }
    ["function"]=>
    string(7) "include"
  }
}

我不明白debug_backtrace()函数到底是怎么工作的。
请任何人解释是受欢迎的。提前感谢。
研究链接:
debug_backtrace() from registered shutdown function in PHP
Debugging PHP Code with debug_backtrace
Assign debug_backtrace() To a variable in PHP
Print PHP Call Stack
How can I save a PHP backtrace to the error log?

7rtdyuoh

7rtdyuoh1#

举个简单的例子...

<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);

echo "Start...";
print_r(debug_backtrace());

function t1 ()  {
    echo "Start t1...";
    print_r(debug_backtrace());

}

function t2()   {
    echo "Start t2...";
    print_r(debug_backtrace());
    t1();
}

echo "before calls...";
print_r(debug_backtrace());
t1();
t2();

将输出...

Start...Array
(
)
before calls...Array
(
)
Start t1...Array
(
    [0] => Array
        (
            [file] => /home/nigel/workspace/PHPTest/TestSource/part3.php
            [line] => 22
            [function] => t1
            [args] => Array
                (
                )

        )

)
Start t2...Array
(
    [0] => Array
        (
            [file] => /home/nigel/workspace/PHPTest/TestSource/part3.php
            [line] => 23
            [function] => t2
            [args] => Array
                (
                )

        )

)
Start t1...Array
(
    [0] => Array
        (
            [file] => /home/nigel/workspace/PHPTest/TestSource/part3.php
            [line] => 17
            [function] => t1
            [args] => Array
                (
                )

        )

    [1] => Array
        (
            [file] => /home/nigel/workspace/PHPTest/TestSource/part3.php
            [line] => 23
            [function] => t2
            [args] => Array
                (
                )

        )

)

我希望这表明debug_backtrace函数所做的只是返回到目前为止所调用的内容。因此,当您第一次调用t1时,它只是对t1调用的堆栈跟踪。对于t2的开始也是如此,但是当t2调用t1时,跟踪列出对t2t1的调用。
但是正如您所看到的,debug_backtraceStart..什么也没显示,因为没有任何级别的代码导致打印此跟踪。
在您的示例中,它调用debug_backtrace并使用or die()表示“如果debug_backtrace不返回任何值,则die()

5m1hhzi4

5m1hhzi42#

我认为debug_backtrace()最有用的方法是跟踪哪个文件是启动内核的init文件,例如

a.php
include 'b.php';

b.php
function test(){
     echo('whatever');
}
print_r(debug_backtrace())

php a.php

whateverArray
(
    [0] => Array
        (
            [file] => /opt/php/b.php
            [line] => 7
            [function] => test
            [args] => Array
                (
                )

        )

    [1] => Array
        (
            [file] => /opt/php/a.php
            [line] => 3
            [args] => Array
                (
                    [0] => /opt/php/b.php
                )

            [function] => include
        )

)

所以你可以从

$backtrace = debug_backtrace()
echo $backtrace[count($backtrace) - 1]['file'];

获取发起呼叫的文件

相关问题