Chcę użyć register_tick_function()
, aby podłączyć następujące połączenia i wydrukować ich ślad stosu z debug_backtrace()
.PHP debug_backtrace() wywoływana przez register_tick_function() nie zwraca pełnego stosu
Jeśli uruchomię następujący kod.
<?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());
Drukuje tylko funkcję dump()
.
Function dump() has been called
Function dump() has been called
Function dump() has been called
Dlaczego nie widzę print()
i array_search()
dane śledzenia? Wygląda na to, że stos został zresetowany przed wywołaniem dump()
. Jestem też prawie pewien, że działało to prawidłowo w przeszłości.
To było zgłaszane jako błąd kilka lat temu, ale wtedy nie było powtarzalne: https://bugs.php.net/bug.php? id = 70188 –
Testowany. Nie można zreplikować w PHP 7.1 na Win, Ubuntu, docker (ubuntu). Nie można zreplikować w PHP 5.6 na Win, Ubuntu, docker (ubuntu). –
Próbowałem tego na http://phpio.net/s/6v6g, i wydaje się nie działać w żadnej z wersji PHP tam. Zobacz więc: https://stackoverflow.com/questions/7241834/debug-backtrace-from-registered-shutdown-function-inphph. Chociaż ta dotyczy rejestru register_shutdown_function, może być taka sama. Śledzenie może rozpocząć się tylko w miejscu, w którym jest wywoływane, co może nie mieć miejsca w tym przypadku. Jest bardziej podobny do tego: 'print (" ");' 'dump();' 'array_search ('green', Array());' 'dump();' Tak więc w tym przypadku naprawdę jest śledzeniem siebie, ponieważ nie jest ono wywoływane z niczego innego. – Huy