Print PHP Call Stack

前端 未结 15 1561
清歌不尽
清歌不尽 2020-11-27 09:08

I\'m looking for a way to print the call stack in PHP.

Bonus points if the function flushes the IO buffer.

相关标签:
15条回答
  • 2020-11-27 09:20

    See debug_print_backtrace. I guess you can call flush afterwards if you want.

    0 讨论(0)
  • var_dump(debug_backtrace());
    

    Does that do what you want?

    0 讨论(0)
  • 2020-11-27 09:24

    Backtrace dumps a whole lot of garbage that you don't need. It takes is very long, difficult to read. All you usuall ever want is "what called what from where?" Here is a simple static function solution. I usually put it in a class called 'debug', which contains all of my debugging utility functions.

    class debugUtils {
        public static function callStack($stacktrace) {
            print str_repeat("=", 50) ."\n";
            $i = 1;
            foreach($stacktrace as $node) {
                print "$i. ".basename($node['file']) .":" .$node['function'] ."(" .$node['line'].")\n";
                $i++;
            }
        } 
    }
    

    You call it like this:

    debugUtils::callStack(debug_backtrace());
    

    And it produces output like this:

    ==================================================
     1. DatabaseDriver.php::getSequenceTable(169)
     2. ClassMetadataFactory.php::loadMetadataForClass(284)
     3. ClassMetadataFactory.php::loadMetadata(177)
     4. ClassMetadataFactory.php::getMetadataFor(124)
     5. Import.php::getAllMetadata(188)
     6. Command.php::execute(187)
     7. Application.php::run(194)
     8. Application.php::doRun(118)
     9. doctrine.php::run(99)
     10. doctrine::include(4)
    ==================================================
    
    0 讨论(0)
  • 2020-11-27 09:28

    If you want a stack trace which looks very similar to how php formats the exception stack trace than use this function I wrote:

    function debug_backtrace_string() {
        $stack = '';
        $i = 1;
        $trace = debug_backtrace();
        unset($trace[0]); //Remove call to this function from stack trace
        foreach($trace as $node) {
            $stack .= "#$i ".$node['file'] ."(" .$node['line']."): "; 
            if(isset($node['class'])) {
                $stack .= $node['class'] . "->"; 
            }
            $stack .= $node['function'] . "()" . PHP_EOL;
            $i++;
        }
        return $stack;
    } 
    

    This will return a stack trace formatted like this:

    #1 C:\Inetpub\sitename.com\modules\sponsors\class.php(306): filePathCombine()
    #2 C:\Inetpub\sitename.com\modules\sponsors\class.php(294): Process->_deleteImageFile()
    #3 C:\Inetpub\sitename.com\VPanel\modules\sponsors\class.php(70): Process->_deleteImage()
    #4 C:\Inetpub\sitename.com\modules\sponsors\process.php(24): Process->_delete() 
    
    0 讨论(0)
  • 2020-11-27 09:28

    Walltearer's solution is excellent, particularly if enclosed in a 'pre' tag:

    <pre>
    <?php debug_print_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); ?>
    </pre>
    

    - which sets out the calls on separate lines, neatly numbered

    0 讨论(0)
  • 2020-11-27 09:29

    Use debug_backtrace to get a backtrace of what functions and methods had been called and what files had been included that led to the point where debug_backtrace has been called.

    0 讨论(0)
提交回复
热议问题