如何调试PHP脚本?

402

如何调试PHP脚本?

我知道基本的调试技巧,例如使用错误报告。在PHPEclipse中使用断点调试也非常有用。

在phpStorm或其他IDE中,哪种方法是最佳的(以快速简便为标准)?


参见:https://dev59.com/bG445IYBdhLWcg3w6eRo - kenorb
在Win/Mac本地调试(使用WAMP/MAMP堆栈和PHPStorm) - Sliq
40
我认为这是一个很好的问题!当你不知道如何解决PHP调试问题时,你甚至不知道如何表达你的问题,也不知道该比这更加精确。所以,这可能不遵守Stack的规则,但它确实对我们这些初学者有很大帮助! - Mihaela Grigore
1
从php5.4开始,引入了一个名为phpdbg(http://phpdbg.com/)的新命令行界面调试器。PHP5.6将默认带有phpdbg。 - Ganesh Patil
1
你听说过 XDebug 吗? :) - Pratik Joshi
显示剩余2条评论
30个回答

145

尝试使用Eclipse PDT来安装具有调试功能的Eclipse环境,就像你所提到的一样。步入代码的能力比旧方法在各个点上进行var_dump()和打印以查看流程错误要好得多。但是如果一切都失败了,我只有SSH和vim,我仍然会使用var_dump()/die()来查找代码出错的地方。


35
你应该使用这个函数:kill( $data ) { die( var_dump ( $data ) ); } 它可以省去输入10个字符,这是我写过的最好的函数,说实话 :) - AlexMorley-Finch
2
试试 https://github.com/tomasfejfar/enhanced-dump :) - Tomáš Fejfar
2
有没有一种方法可以美化“var_dump”? - RPDeshaies
6
@AlexMorley-Finch,我向你展示 kill($data) { echo "<pre>"; var_dump($data); echo "</pre>"; exit; } 的代码。该函数可用于打印并终止程序,并以易于阅读的方式显示数据。 - Francisco Presencia
2
链接可以通过令人难以置信的Web Archive进行恢复,最后检查时间为2015年5月7日。 - Gruber
显示剩余4条评论

80

您可以使用Firephp这个firebug的附加组件在与JavaScript相同的环境中调试PHP。

我还使用之前提到的Xdebug来分析PHP。


3
这是使用FirePHP的快速指南:http://www.sitepoint.com/debug-php-firebug-firephp/ - Mihaela Grigore

38

这是我的小型调试环境:

error_reporting(-1);
assert_options(ASSERT_ACTIVE, 1);
assert_options(ASSERT_WARNING, 0);
assert_options(ASSERT_BAIL, 0);
assert_options(ASSERT_QUIET_EVAL, 0);
assert_options(ASSERT_CALLBACK, 'assert_callcack');
set_error_handler('error_handler');
set_exception_handler('exception_handler');
register_shutdown_function('shutdown_handler');

function assert_callcack($file, $line, $message) {
    throw new Customizable_Exception($message, null, $file, $line);
}

function error_handler($errno, $error, $file, $line, $vars) {
    if ($errno === 0 || ($errno & error_reporting()) === 0) {
        return;
    }

    throw new Customizable_Exception($error, $errno, $file, $line);
}

function exception_handler(Exception $e) {
    // Do what ever!
    echo '<pre>', print_r($e, true), '</pre>';
    exit;
}

function shutdown_handler() {
    try {
        if (null !== $error = error_get_last()) {
            throw new Customizable_Exception($error['message'], $error['type'], $error['file'], $error['line']);
        }
    } catch (Exception $e) {
        exception_handler($e);
    }
}

class Customizable_Exception extends Exception {
    public function __construct($message = null, $code = null, $file = null, $line = null) {
        if ($code === null) {
            parent::__construct($message);
        } else {
            parent::__construct($message, $code);
        }
        if ($file !== null) {
            $this->file = $file;
        }
        if ($line !== null) {
            $this->line = $line;
        }
    }
}

2
谢谢。那救了我的一天。(我只需要移除那个E_STRICT) - Sec
4
assert_callback 翻译为“断言回调函数”。 - Madbreaks

32

Xdebug和Notepad++的DBGp插件适用于重度漏洞猎捕,FirePHP适用于轻量级漏洞。想要快速而不拘小节?没有什么比dBug更好了。


DBGp插件与当前版本的notepad++/xdebug不兼容,也没有修复的计划。您可以查看我与创建者的讨论,链接在这里:http://stackoverflow.com/questions/18172253/xdebug-notepad-dbpg-plugin-local-and-global-context-not-showing/18187323#18187323 - Joe

26

XDebug 对于开发非常重要。我会在安装任何其他扩展之前先安装它。它可以在发生任何错误时提供堆栈跟踪,并且您可以轻松启用分析。

如果想快速查看数据结构,请使用var_dump()。不要使用print_r(),因为您需要将其包围在<pre>标签中并且一次只能打印一个变量。

<?php var_dump(__FILE__, __LINE__, $_REQUEST); ?>

我发现最好的实际调试环境是Komodo IDE,但它需要花费$$。


19

PhpEd真的很好。你可以进入/跳过/退出函数。你可以运行临时代码,检查变量,更改变量。这太棒了。


4
与NetBeans或Eclipse这样的真正IDE相比,我对PhpEd没有什么好话要说,这条评论也没有为问题增添任何有用的内容。-1 - siliconrockstar
在购买PhpED专业版之前,我试用了大多数IDE(包括Zend、NetBeans和Eclipse),因为它是最好的选择。这是几年前的事情了,所以其他IDE可能已经有所改进,但当时它们中的大多数都非常缓慢,因为它们是用Java编写的。我不明白为什么有人会对它毫不客气,因为对我来说,它显然是最好的选择,决定是显而易见的。 - lm713

17

1)我使用print_r()函数。在TextMate中,我有一个名为“pre”的代码片段,它会被扩展成以下内容:

echo "<pre>";
print_r();
echo "</pre>";

2) 我使用Xdebug,但是在我的Mac上无法正常使用GUI。它至少会打印出可读版本的堆栈跟踪。


我确定你是想在结尾处使用echo "</pre>";。 - altermativ
9
你可以在这个函数中传入'true',这样它会返回字符串。这意味着你可以这样做:echo '<pre>', print_r($var, true), '</pre>'; - DisgruntledGoat

16

16

老实说,我会用print和print_r()的组合来打印变量。我知道许多人更喜欢使用其他更高级的方法,但我发现这是最容易使用的。

我要说的是,直到我在大学做微处理器编程时无法使用甚至连这种方法都没有充分认识到它的重要性。


我很高兴你提到了print和print_r,我使用基本的print来查看代码是否执行到某个特定点,这有助于隔离问题。 - Brad
我同时使用print和var_dump()。我使用print来显示调试信息和其他信息,而使用var_dump来指示变量随着事物的进展而发生的状态变化。 - Joshua K

14

Xdebug是由Derick Rethans开发的一个非常好用的工具。我曾经使用过,但发现安装并不是那么容易。不过一旦你安装好了,就会发现你以前是如何没有它而生存的 :-)

Zend Developer Zone有一篇很好的文章介绍了它(在Linux上安装可能也并不容易),甚至还有一个Firefox插件,但我从未使用过。


2
安装并不仅是烦人的事。配置Xdebug与Eclipse一起工作可能是一场噩梦。我能够在CentOS 5上安装Xdebug,但EclipsePDT+Xdebug不想合作:( - Jahangir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接