我如何获得PHP的getTraceAsString()的完整字符串?

2022-08-30 15:37:16

我正在使用堆栈跟踪,但由于某种原因字符串被截断。getTraceAsString()

例如,抛出一个异常,我使用以下命令记录字符串:

catch (SoapFault $e) {
error_log( $e->getTraceAsString() )
}

打印出来的字符串是:

#0 C:\somedirectory\somedirectory\somedirectory\somedir\someScript.php(10): SoapClient->SoapClient('http://www.ex...')

如何打印完整的字符串?


答案 1

我创建了这个函数来返回一个没有截断字符串的堆栈跟踪:

function getExceptionTraceAsString($exception) {
    $rtn = "";
    $count = 0;
    foreach ($exception->getTrace() as $frame) {
        $args = "";
        if (isset($frame['args'])) {
            $args = array();
            foreach ($frame['args'] as $arg) {
                if (is_string($arg)) {
                    $args[] = "'" . $arg . "'";
                } elseif (is_array($arg)) {
                    $args[] = "Array";
                } elseif (is_null($arg)) {
                    $args[] = 'NULL';
                } elseif (is_bool($arg)) {
                    $args[] = ($arg) ? "true" : "false";
                } elseif (is_object($arg)) {
                    $args[] = get_class($arg);
                } elseif (is_resource($arg)) {
                    $args[] = get_resource_type($arg);
                } else {
                    $args[] = $arg;
                }   
            }   
            $args = join(", ", $args);
        }
        $rtn .= sprintf(
            "#%s %s(%s): %s%s%s(%s)\n",
            $count,
            $frame['file'],
            $frame['line'],
            isset($frame['class']) ? $frame['class'] : '',
            isset($frame['type']) ? $frame['type'] : '', // "->" or "::"
            $frame['function'],
            $args
        );
        $count++;
    }
    return $rtn;
}

或者,您可以编辑 php 源,它正在截断输出:https://github.com/php/php-src/blob/master/Zend/zend_exceptions.c#L392


答案 2

这里有一些更好的版本 https://stackoverflow.com/a/6076667/194508,https://gist.github.com/1437966 输出中添加了类。


推荐