обратная трассировка отладки — PHP debug_backtrace (), вызываемый register_tick_function (), не возвращает полный стек

Я хочу использовать register_tick_function() перехватить следующие вызовы и распечатать их трассировку стека debug_backtrace(),

Если я запускаю следующий код.

<?php

function dump() {
// Replace this with var_dump(debug_backtrace()); to print the entire trace.
foreach (debug_backtrace() as $trace)
echo("Function ${trace['function']}() has been called" . PHP_EOL);
}

declare(ticks = 1);
register_tick_function('dump');

print("");
array_search('green', Array());

Он печатает только dump() функция.

Function dump() has been called
Function dump() has been called
Function dump() has been called

Почему я не вижу print() а также array_search() данные трассировки? Это как стек был сброшен перед вызовом dump(), Я также уверен, что в прошлом все работало правильно.

6

Решение

Вы не понимаете, что такое обратная трассировка, этот стек — не список функций, которые PHP выполнял до достижения определенной строки кода, а скорее список вложенных функций, которые оправдывают интерпретатор PHP на определенной строке кода.

Первым элементом всегда будет функция, в которой вы находитесь в данный момент, следующим будет функция, которая вызвала эту функцию и так далее. Если функция возвращается, ее больше нет в стеке.

class Foo {
public static function bar() {
return self::say();
}

public static function say() {
return debug_backtrace();
}
}

var_dump(Foo::say());
//[0] => say()

var_dump(Foo::bar());
//[0] => say();
//[1] => bar();

//Note that this behaviour work the same for require(), include() and eval()

require_once('test.php');

//test.php:
var_dump(debug_backtrace());
//[0] => require_once()

Поскольку PHP интерпретирует ваш скрипт, он перемещается по вашим функциям, добавляя и удаляя из текущего стека. Стек обратного следа — это не то место, где в журналах PHP записывались функции, которые вызывались в хронологическом порядке.

Для последнего это решение, которое я нашел: Получить список вызываемых функций в PHP

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector