Ich möchte register_tick_function()
verwenden, um die folgenden Aufrufe haken und drucken ihre Stack-Trace mit debug_backtrace()
.PHP debug_backtrace() von register_tick_function() aufgerufen wird nicht den vollständigen Stapel
Wenn ich den folgenden Code ausführen.
<?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());
Es druckt nur die dump()
Funktion.
Function dump() has been called
Function dump() has been called
Function dump() has been called
Warum ich sehe nicht print()
und array_search()
Trace-Daten? Es ist so, als ob der Stapel vor dem Aufruf von dump()
zurückgesetzt wurde. Ich bin mir auch ziemlich sicher, dass es in der Vergangenheit richtig funktioniert hat.
Dies als Fehler vor ein paar Jahren berichtet wurde, war aber dann nicht reproduzierbar: https://bugs.php.net/bug.php? id = 70188 –
Getestet. Kann in PHP 7.1 auf Win, Ubuntu, Docker (Ubuntu) nicht replizieren. Kann nicht in PHP 5.6 auf Win, Ubuntu, Docker (Ubuntu) replizieren. –
Ich habe das auf http://phpio.net/s/6v6g versucht, und es scheint auch in keiner der PHP-Versionen dort zu funktionieren. So sehen Sie dieses: https://stackoverflow.com/questions/7241834/debug-backtrace-from-registered-shutdown-function-in-php. Obwohl es sich um register_shutdown_function handelt, kann es dasselbe sein. Die Ablaufverfolgung kann nur von der Stelle aus beginnen, an der sie aufgerufen wird, was in diesem Fall möglicherweise nicht der Fall ist. Es ist mehr wie folgt: 'print (" ");' 'dump();' 'array_search ('grün', Array());' 'dump();' Also in diesem Fall, es verfolgt sich selbst, da es von innen nichts anderes genannt wird. – Huy