Intereting Posts
Как пропустить некоторые поля из базы данных при использовании fputcsv Понимание того, что \ u0000 находится в PHP / JSON и избавиться от него Почему разные строки частного ключа в Linux или Windows? насколько зрелым является HTML + CSS в отношении создания отчетов для печати? Помогите проверить, работает ли прокси-сервер, используя php Обновление нескольких столбцов таблицы MySQL с использованием массивов с PDO Gettext работает иногда браузер загружает php-файл с веб-сервера apache Резидентное решение RESTful, используемое с backbone.js … в PHP? IcePHP не может открыть общий объектный файл: нет такого файла или каталога в Unknown в строке 0 Laravel – Многостраничный сайт / Проект Laravel 4 удаление нескольких моделей, связанных с внешними ключами PHP: Как читать файл .txt с FTP-сервера в переменную? Как получить имя вызывающей функции / метода в PHP? Развертывание на несколько серверов

Как я могу получить полную строку getTraceAsString () PHP?

Я использую getTraceAsString() для получения трассировки стека, но по какой-то причине строка усекается.

Например, генерируется исключение, и я записываю строку, используя:

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

Строка, которая печатает:

# 0 C: \ Somedirectory \ Somedirectory \ Somedirectory \ Somedir \ SomeScript.php (10): SoapClient-> SoapClient (' http: //www.ex …')

Как я могу получить полную строку для печати?

Я создал эту функцию для возврата трассировки стека без усеченных строк:

 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)\n", $count, $frame['file'], $frame['line'], $frame['function'], $args ); $count++; } return $rtn; } 

Кроме того, вы можете отредактировать источник php, где он обрезает вывод: https://github.com/php/php-src/blob/master/Zend/zend_exceptions.c#L392

Некоторая лучшая версия https://stackoverflow.com/a/6076667/194508 здесь https://gist.github.com/1437966 добавила класс для вывода.

Это решение хорошо, но в моем случае оно породило ошибку, потому что в моем следе есть внутренние функции. Я добавил несколько строк кода, чтобы проверить это, чтобы функции трассировки все еще работали.

 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); } $current_file = "[internal function]"; if(isset($frame['file'])) { $current_file = $frame['file']; } $current_line = ""; if(isset($frame['line'])) { $current_line = $frame['line']; } $rtn .= sprintf( "#%s %s(%s): %s(%s)\n", $count, $current_file, $current_line, $frame['function'], $args ); $count++; } return $rtn; } 

Будет ли изменяться настройка php.ini log_errors_max_len ?

Также обратите внимание, что сообщения усекаются только во время вывода, вы все равно можете получить исходное сообщение об ошибке с вызовом $ exception-> getMessage ()

Существует также отличный рецепт jTraceEx Эрнеста Фогельсингера по адресу http://php.net/manual/fr/exception.getmessage.php , который поддерживает связанные исключения и отформатирован в стиле Java.

Вот сравнение, взятое непосредственно из его комментария на php.net:

Исключение :: getTraceAsString:

 #0 /var/htdocs/websites/sbdevel/public/index.php(70): seabird\test\C->exc() #1 /var/htdocs/websites/sbdevel/public/index.php(85): seabird\test\C->doexc() #2 /var/htdocs/websites/sbdevel/public/index.php(89): seabird\test\fail2() #3 /var/htdocs/websites/sbdevel/public/index.php(93): seabird\test\fail1() #4 {main} 

jTraceEx:

 Exception: Thrown from class C at seabird.test.C.exc(index.php:78) at seabird.test.C.doexc(index.php:70) at seabird.test.fail2(index.php:85) at seabird.test.fail1(index.php:89) at (main)(index.php:93) Caused by: Exception: Thrown from class B at seabird.test.B.exc(index.php:64) at seabird.test.C.exc(index.php:75) ... 4 more Caused by: Exception: Thrown from class A at seabird.test.A.exc(index.php:46) at seabird.test.B.exc(index.php:61) ... 5 more 

Если вы можете уйти с var_dump() , простым решением будет:

 try { ... } catch (Exception $e) var_dump($e->getTrace()); } 

Украден из этого великого ответа Андре