PHP dev & debug: var_dump, var_export, error_log and FirePHP (Part 1)

总结一下最近比较常用或是刚刚发现觉得比较好用的php dev & debug tool,肯定不全面,欢迎大伙补充。

1. var_dump()
用法很简单,就是你要dump什么data就传给这个方法什么data(其支持可变参数,不过一般还是习惯一个data一个var_dump())。它的好处很像ruby里的PP(pretty print),不过limit是只能输出到标准输出(php-cli是输出到控制台,php网页便是browser).

<?php
$tools = array("var_dump", "var_export", "error_log", array("Firebug", array("FirePHP")));
var_dump($tools);
?>
array
  0 => string 'var_dump' (length=8)
  1 => string 'var_export' (length=10)
  2 => string 'error_log' (length=9)
  3 =>
    array
      0 => string 'Firebug' (length=7)
      1 =>
        array
          0 => string 'FirePHP' (length=7)


2. var_dump(), die()
之前提到var_dump()的一个limit是网页page只能输出到浏览器,如果遇到页面redirect的,该限制的不足就会体现出来,处理这个问题的一个办法是配合使用die(),让程序halt在var_dump()之后,这样页面没机会跳转,我们亦有充足的时间查看浏览器上的输出。

<?php
$tools = array("var_dump", "var_export", "error_log", array("Firebug", array("FirePHP")));
var_dump($tools);
die();
var_dump("this won't show up");
?>

3. error_log()
die()有利有弊,因为有时候可能我们并不想就此halt程序,解决var_dump()限制的另外一个方法是釜底抽薪,换用error_log()。
error_log望文生义貌似是用来log error的,这里我们也可以用来log我们关心的data。
要使用error_log,需要在php.ini里面设置一下:

log_errors = On
error_log = /path/to/php_errors.log

试一下效果,由于error_log的message必须是string,我们这里简单的cast一下:

<?php
$tools = array("var_dump", "var_export", "error_log", array("Firebug", array("FirePHP")));
error_log((string)$tools);
?>

tail一下log file:

[02-Jul-2010 16:38:03] Array

貌似不是很useful,自己implode()成string又太麻烦了,而且不general,看来我们还需要其它function的配合。

4. error_log(), var_dump(), output buffering control
首先想到的是前面的var_dump()到底能不能输出到log,其实也不是不行,就是有点麻烦。利用php的output buffering,我们可以把var_dump()的输出redirect到string,这时再用error_log输出这个string应该可以解决问题。

<?php
$tools = array("var_dump", "var_export", "error_log", array("Firebug", array("FirePHP")));
ob_start();
var_dump($tools);
$result = ob_get_clean();
error_log($result);
?>

可惜事不遂人愿,log file得到了如下的browser friendly输出,disable xdebug-var-dump extension和禁止php error_prepend_string和error_append_string可能可以得到相对清晰的输出,但这不是我们想要的。

[02-Jul-2010 16:56:53] <pre class='xdebug-var-dump' dir='ltr'>
<b>array</b>
  0 <font color='#888a85'>=&gt;</font> <small>string</small> <font color='#cc0000'>'var_dump'</font> <i>(length=8)</i>
  1 <font color='#888a85'>=&gt;</font> <small>string</small> <font color='#cc0000'>'var_export'</font> <i>(length=10)</i>
  2 <font color='#888a85'>=&gt;</font> <small>string</small> <font color='#cc0000'>'error_log'</font> <i>(length=9)</i>
  3 <font color='#888a85'>=&gt;</font>
    <b>array</b>
      0 <font color='#888a85'>=&gt;</font> <small>string</small> <font color='#cc0000'>'Firebug'</font> <i>(length=7)</i>
      1 <font color='#888a85'>=&gt;</font>
        <b>array</b>
          0 <font color='#888a85'>=&gt;</font> <small>string</small> <font color='#cc0000'>'FirePHP'</font> <i>(length=7)</i>
</pre>

5. error_log(), var_export()
看来我们还是得忍痛舍弃var_dump(),一个replacement是var_export()。var_export()的第二个参数接受一个boolean值,我们可以用它来指定是否需要作为结果返回还是直接输出。

<?php
$tools = array("var_dump", "var_export", "error_log", array("Firebug", array("FirePHP")));
error_log(var_export($tools, true));
?>

这回log file终于干净很多了:

[02-Jul-2010 17:10:29] array (
  0 => 'var_dump',
  1 => 'var_export',
  2 => 'error_log',
  3 =>
  array (
    0 => 'Firebug',
    1 =>
    array (
      0 => 'FirePHP',
    ),
  ),
)

ok,文章已经太长,已经超出了我能忍受的范围,遂决定就此打住,定为part 1,下篇part 2会介绍FirePHP,敬请期待~

历史上的今天:

Related posts:

2 Comments on "PHP dev & debug: var_dump, var_export, error_log and FirePHP (Part 1)"

  1. 净空无道 China Mozilla Firefox Windows says:

    你居然开始玩PHP了?泰罕见了……

Got something to say? Go for it!

使用新浪微博登陆