2010-11-26 5 views
12

Посмотрим правде в глаза, debug_backtrace() Вывод не очень красивый. Кто-нибудь закодировал обертку?Есть ли дамп для печати Pretty Print?

А что ваш любимый довольно var_dump() (который может использоваться в коммерческих проектах, так что никаких GPL (хотя LGPL нормально))

Смотрите также: A more pretty/informative Var_dump alternative in PHP?


Шесть лет - и десять тысяч просмотров этого вопроса - позже, и я все еще использую это. Это не очень хорошо выглядит на экране, например, Kint (что отлично).

Это простой текст, который я могу написать себе в автоматических отчетах об ошибках и может отображаться в консоли разработчика браузера, используя ChromePhp.

/** 
* @brief Returns an HTML formatted string showing details of the backtrace 
* 
* Example: 
* 
* F:\Dropbox\programs\Xampp\htdocs\api\q.php:48 e(373, 'beer', 'curry') 
* F:\Dropbox\programs\Xampp\htdocs\api\q.php:53 d(26366, 28255, 8364) 
* F:\Dropbox\programs\Xampp\htdocs\api\q.php:58 c() 
* F:\Dropbox\programs\Xampp\htdocs\api\q.php:63 b(1283, 15488, 29369) 
* F:\Dropbox\programs\Xampp\htdocs\api\q.php:72 a(788, 6077, 25010) 
*/ 
function FormatBacktrace() 
{ 
    $result = '<h4>Backtrace</h4>'; 

    foreach (debug_backtrace() as $trace) 
    { 
     if ($trace['function'] ==__FUNCTION__) 
      continue; 

     $parameters = ''; 
     foreach ($trace['args'] as $parameter) 
      $parameters .= $parameter . ', '; 

     if (substr($parameters, -2) == ', ') 
     $parameters = substr($parameters, 0, -2); 

     if (array_key_exists('class', $trace)) 
     $result .= sprintf("%s:%s %s::%s(%s)<br>", 
           $trace['file'], 
           $trace['line'],  
           $trace['class'], 
           $trace['function'], 
           $parameters); 
     else 
     $result .= sprintf("%s:%s %s(%s)<br>", 
           $trace['file'], 
           $trace['line'], 
           $trace['function'], 
           $parameters); 
    } 

    return $result; 
} 
+0

Пожалуйста, не редактируйте ответы, такие как ваше собственное решение, в поле «вопрос»; мы предпочитаем строго разделять две части страницы. Вместо этого вы [рекомендуется отвечать на свой вопрос] (http://stackoverflow.com/help/self-answer), если у вас есть информация, выходящая за пределы перечисленных в настоящее время ответов. – IMSoP 2017-02-22 17:47:45

ответ

6

Xdebug extension может print stacktraces с настраиваемой степенью многословием.

Xdebug stacktrace image

Он также предлагает некоторые additional var_dump() features, такие как подсветка синтаксиса:

Colored var_dump()

Edit:

Что касается включения Xdebug в коммерческий проект.

Xdebug license имеет всего несколько терминов и кажется довольно разрешительным.

Xdebug - расширение C. Поскольку такое перераспределение его или его части в вашем проекте может быть несколько сложным. В зависимости от ваших требований я вижу несколько вариантов:

  • Попросите конечного пользователя установить Xdebug из дистрибутива Linux или DLL с сайта
  • Распределить .dll и.поэтому файлы для всех поддерживаемых платформ
  • Попросите конечному пользователю построить исходный код
  • Распределить пользовательскую сборку PHP
+0

+1, но он доступен как отдельный код? – Mawg 2010-11-26 02:55:24

2

Вот это "довольно ПРИНТ" var_dump

function vdump() { 

    $args = func_get_args(); 

    $backtrace = debug_backtrace(); 
    $code = file($backtrace[0]['file']);  

    echo "<pre style='background: #eee; border: 1px solid #aaa; clear: both; overflow: auto; padding: 10px; text-align: left; margin-bottom: 5px'>"; 

    echo "<b>".htmlspecialchars(trim($code[$backtrace[0]['line']-1]))."</b>\n"; 

    echo "\n"; 

     ob_start(); 

      foreach ($args as $arg) 
       var_dump($arg); 

      $str = ob_get_contents(); 

     ob_end_clean(); 

     $str = preg_replace('/=>(\s+)/', ' => ', $str); 
     $str = preg_replace('/ => NULL/', ' &rarr; <b style="color: #000">NULL</b>', $str); 
     $str = preg_replace('/}\n(\s+)\[/', "}\n\n".'$1[', $str); 
     $str = preg_replace('/ (float|int)\((\-?[\d\.]+)\)/', " <span style='color: #888'>$1</span> <b style='color: brown'>$2</b>", $str); 

     $str = preg_replace('/array\((\d+)\) {\s+}\n/', "<span style='color: #888'>array&bull;$1</span> <b style='color: brown'>[]</b>", $str); 
     $str = preg_replace('/ string\((\d+)\) \"(.*)\"/', " <span style='color: #888'>str&bull;$1</span> <b style='color: brown'>'$2'</b>", $str); 
     $str = preg_replace('/\[\"(.+)\"\] => /', "<span style='color: purple'>'$1'</span> &rarr; ", $str); 
     $str = preg_replace('/object\((\S+)\)#(\d+) \((\d+)\) {/', "<span style='color: #888'>obj&bull;$2</span> <b style='color: #0C9136'>$1[$3]</b> {", $str); 
     $str = str_replace("bool(false)", "<span style='color:#888'>bool&bull;</span><span style='color: red'>false</span>", $str); 
     $str = str_replace("bool(true)", "<span style='color:#888'>bool&bull;</span><span style='color: green'>true</span>", $str); 

     echo $str; 

    echo "</pre>"; 

    echo "<div class='block tiny_text' style='margin-left: 10px'>"; 

     echo "Sizes: "; 
     foreach ($args as $k => $arg) { 

      if ($k > 0) echo ","; 
      echo count($arg); 

     } 

    echo "</div>"; 

} 
+0

+1 Я попробую. Спасибо – Mawg 2010-11-26 02:55:44

1
+0

+1, но он доступен как отдельный код? – Mawg 2010-11-26 03:22:55

+1

@Mawg - вы можете использовать этот пакет: http://epic.codeutopia.net/pack/, который позволит вам выбрать нужные компоненты и автоматически включать их зависимости. ZF отделен, насколько это практически возможно. – karim79 2010-11-26 11:00:44

+0

+1 звук хороший. Спасибо – Mawg 2010-11-27 14:50:45

6

Вот моя красавица печати оболочка, которая предназначена для вывода без браузера, то есть журналы ошибок или консоль:

function stackTrace() { 
    $stack = debug_backtrace(); 
    $output = ''; 

    $stackLen = count($stack); 
    for ($i = 1; $i < $stackLen; $i++) { 
     $entry = $stack[$i]; 

     $func = $entry['function'] . '('; 
     $argsLen = count($entry['args']); 
     for ($j = 0; $j < $argsLen; $j++) { 
      $func .= $entry['args'][$j]; 
      if ($j < $argsLen - 1) $func .= ', '; 
     } 
     $func .= ')'; 

     $output .= $entry['file'] . ':' . $entry['line'] . ' - ' . $func . PHP_EOL; 
    } 
    return $output; 
} 
9

Вы также kint (github repo), который имеет composer пакет на packagist хранилище

Так что либо загрузить библиотеку вручную или с composer, это просто вопрос:

$ composer init 
$ composer require raveren/kint 
$ composer install 

Тогда вместо ini_set('display_errors', 'On');, я предпочитаю использовать этот простой обработчик в моей основной (первый) инклюднике:

if ( getenv('__project_env__') === 'DEV') { 

    error_reporting(E_ALL | E_STRICT); 

    function shutdown_handler() { 
    $error = error_get_last(); 
    Kint::trace(); 
    Kint::dump($error); 
    } 
    register_shutdown_function('shutdown_handler'); 

} else { 
... 
} 

с __project_env__ быть установлен в VirtualHost в Apache(), чтобы не загрязнять различные ветви git хранилища, где проект живет с элементами конфигурации, которые являются по существу environmental

  • В DEV: я получаю мои отладки
  • В PROD, он молчит по умолчанию

Вот скриншот того, как след выглядит (каждый шаг разборный):

Kint stack trace

0

Мой снимок var_dump Я сделал несколько лет назад и с тех пор работает над совершенствованием. Я знаю, что там есть lib, которые создают действительно красивые причуды с аккордеонными меню и все, но я просто хочу простой макет, легко читаемый, может быть, немного HTML, и такой же переносимый, как и один метод кода. Таким образом, моя функция:

function preDump() { // use string "noEcho" to just get a string return only 
    $args = func_get_args(); 
    $doEcho = TRUE; $sb; 
    if ($args) { 
     $sb = '<div style="margin: 1em 0;"><fieldset style="display:inline-block;padding:0em 3em 1em 1em;"><legend><b>preDump: '.count($args).' Parameters Found.</b></legend>'; 
     foreach (func_get_args() as $arg) { 
      if (gettype($arg) == 'string') if ($arg == 'noEcho') { $doEcho = FALSE; $sb = preg_replace('/(preDump:)[0-9]+/', 'preDump: '.(count($args)-1), $sb); continue; } 
      $sb .= '<pre data-type="'.gettype($arg).'"'; 
      switch (gettype($arg)) { 
       case "boolean": 
       case "integer": 
        $sb .= ' data-dump="json_encode"><p style="border-bottom:1px solid;margin:0;padding:0 0 0 1em;"><b>gettype('.gettype($arg).')</b></p><p>'; 
        $sb .= json_encode($arg); 
        break; 
       case "string": 
        $sb .= ' data-dump="echo"><p style="border-bottom:1px solid;margin:0;padding:0 0 0 1em;"><b>gettype('.gettype($arg).')</b></p><p>'; 
        $sb .= $arg; 
        break; 
       default: 
        $sb .= ' data-dump="var_dump"'; 
        if (is_object($arg)) $sb .= 'data-class="'.get_class($arg).'"'; 
        $sb .= '><p style="border-bottom:1px solid;margin:0;padding:0 0 0 1em;"><b>gettype('.gettype($arg).')'; 
        if (is_object($arg)) $sb .= ' ['.get_class($arg).']'; 
        $sb .= '</b></p><p>'; 
        ob_start(); 
        var_dump($arg); 
        $sb .= ob_get_clean(); 
        if (ob_get_length()) ob_end_clean(); 
      } 
      $sb .= '</p></pre>'; 
     } 
     $sb .= '</fieldset></div>'; 
    } 
    else { 
     $sb = '<div style="margin: 1em 0;"><fieldset style="display:inline-block;"><legend><b>preDump: [ERROR]</b></legend><h3>No Parameters Found</h3></fieldset></div>'; 
    } 
    if ($doEcho) echo($sb); 
    return $sb; 
} 

Использование чрезвычайно простое. Он принимает бесконечные параметры. Кроме того, он показывает все в пределах простого fieldsets для каждого вызванного preDump, а также для разделения каждого параметра на свой собственный тег pre, что делает его чистым и удобным для чтения. Каждый тег pre также содержит заголовок, показывающий gettype каждого параметра, и, если это объект, он также отображает class name.

Используйте так же легко, как var_dump();

preDump(TRUE, 101, 'this is a string', array('array', 'here'), (object)array ('this' => 'is', 'an' => 'object'), $someXMLvariable); 

Вы также можете использовать его, чтобы получить дамп в виде простой строки, а затем эхо, когда вы посчитаете нужным: довольно метод печати StackTrace

$bob = preDump($someParam1, $someParam2, 'noEcho'); // 'noEcho' causes it to return as string only 
3

jhurliman превыше действительно здорово. Но для меня это создавало множество PHP-предупреждений, которые также загромождали журнал. Я добавил немного больше ошибок и проверки типов, что приводит к очень хорошей трассировке стека в журналах.Вот модифицированная версия кода jhurliman:

function stackTrace() { 
    $stack = debug_backtrace(); 
    $output = ''; 

    $stackLen = count($stack); 
    for ($i = 1; $i < $stackLen; $i++) { 
     $entry = $stack[$i]; 

     $func = $entry['function'] . '('; 
     $argsLen = count($entry['args']); 
     for ($j = 0; $j < $argsLen; $j++) { 
      $my_entry = $entry['args'][$j]; 
      if (is_string($my_entry)) { 
       $func .= $my_entry; 
      } 
      if ($j < $argsLen - 1) $func .= ', '; 
     } 
     $func .= ')'; 

     $entry_file = 'NO_FILE'; 
     if (array_key_exists('file', $entry)) { 
      $entry_file = $entry['file'];    
     } 
     $entry_line = 'NO_LINE'; 
     if (array_key_exists('line', $entry)) { 
      $entry_line = $entry['line']; 
     }   
     $output .= $entry_file . ':' . $entry_line . ' - ' . $func . PHP_EOL; 
    } 
    return $output; 
}