我们如何调试PHP脚本?
我们如何调试PHP脚本?
我知道基本调试,例如使用错误报告。 PHPEclipse中的断点调试也非常有用。
在phpStorm或者任何其他IDE中进行调试的最佳方式(快速简便)是什么?
解决方案:
我已经使用Zend Studio(5.5)和Zend Platform。尽管付出了一定的代价,但这却可以提供适当的调试,断点/单步执行代码等功能。
尝试使用Eclipse PDT来设置一个具有上述调试功能的Eclipse环境。与旧方法var_dump相比,调试代码的能力是一种更好的方法,它可以在各个点进行打印并在各个位置进行打印,以查看流向哪里出错。当所有其他方法都失败了,而我所拥有的只是SSH和vim时,我仍然使用var_dump()// die()来查找代码的去向。
print_r(debug_backtrace());
或者类似的东西 :-)
Derick Rethans撰写的Xdebug非常好。我前一段时间使用它,发现它并不是那么容易安装。一旦完成,我们将不了解没有它的管理方式:-)
在Zend Developer Zone上有一篇不错的文章(在Linux上安装似乎并不容易),甚至还有一个我从未使用过的Firefox插件。
老实说,print和print_r()的组合可以打印出变量。我知道许多人喜欢使用其他更高级的方法,但是我发现这是最容易使用的方法。
我要说的是,直到我在Uni进行了一些微处理器编程,甚至不能使用它时,我才完全意识到这一点。
为print_r()+1. 用它来转储对象或者变量的内容。为了使其更具可读性,请使用pre标记,这样就无需查看源代码。
echo '<pre>'; print_r($arrayOrObject);
还有var_dump($ thing),这对于查看subthings的类型非常有用
我们可以在与javascript相同的环境中使用Firephp添加组件来调试Firebug以调试php。
我还使用前面提到的Xdebug来分析php。
根据问题,我喜欢将error_reporting(E_ALL)与回显测试混合使用(以查找违规的行/文件,该错误是在最初发生的;我们知道它并不总是php / line / file告诉吗?),IDE大括号匹配(解决"解析错误:语法错误,意外的$ end"问题)和print_r();出口;转储(真正的程序员查看源代码; p)。
我们也无法使用" memory_get_usage();"来击败phpdebug(检查sourceforge)。和" memory_get_peak_usage();"找到问题所在。
1)我使用print_r()。在TextMate中,我有一个'pre'的代码片段,它扩展为:
echo "<pre>"; print_r(); echo "</pre>";
2)我使用Xdebug,但无法在Mac上正常运行GUI。它至少打印出堆栈跟踪的可读版本。
在生产环境中,我使用error_log()将相关数据记录到服务器的错误日志中。
我使用带有内置调试器的zend Studio进行蚀。与使用xdebug使用eclipse pdt进行调试相比,其速度仍然很慢。希望他们能解决这些问题,速度比最近的发行版有所提高,但处理问题仍需要2-3秒。
zend firefox工具栏确实使事情变得简单(调试下一页,当前页面等)。它还提供了一个探查器,它将对代码进行基准测试,并提供饼图,执行时间等。
对于确实很棘手的问题,使用print_r / echo来弄清时间太费时了,我使用了我的IDE(PhpEd)调试功能。与我使用过的其他IDE不同,PhpEd几乎不需要进行任何设置。我不将其用于遇到的任何问题的唯一原因是它的运行速度极慢。我不确定速度是否特定于PhpEd或者任何php调试器。 PhpEd不是免费的,但我相信它还是会使用一种开源调试器(如前面提到的XDebug)。同样,PhpEd的好处在于它不需要任何设置,而我在过去发现这非常繁琐。
对我来说,手动调试通常会更快一些,而var_dump()和debug_print_backtrace()则是武装逻辑所需的全部工具。
XDebug对于开发至关重要。我先安装它,再安装其他任何扩展程序。它为我们提供了有关任何错误的堆栈跟踪,并且我们可以轻松启用分析。
为了快速查看数据结构,请使用" var_dump()"。不要使用print_r()
,因为我们必须将其用<pre>
包围起来,并且一次只能打印一个var。
<?php var_dump(__FILE__, __LINE__, $_REQUEST); ?>
对于真正的调试环境,我发现的最好的是Komodo IDE,但价格为$$。
Komodo IDE可以很好地与xdebug配合使用,甚至可以进行更多的调试。它需要最少的配置。我们所需要的只是Komodo可以在本地使用的php版本,以在断点处单步执行代码。如果我们将脚本导入到komodo项目中,则可以用鼠标单击设置断点,就像在eclipse内如何设置断点以调试Java程序一样。
远程调试显然要使其正常工作(我们可能必须在工作区中用php脚本映射远程URL)比本地调试设置更为棘手,如果我们在MAC或者linux桌面上,则本地调试设置很容易配置。
集成的调试器非常不错,我们可以在其中调试代码时观察变量的值。但是,它们确实需要在服务器上进行软件设置,并在客户端上进行一定数量的配置。两者都需要定期维护以保持良好的工作状态。
print_r易于编写,并保证可以在任何设置中工作。
我将Netbeans与XDebug一起使用。
在其网站上查看有关如何配置它的文档。
http://php.netbeans.org/
Xdebug和用于Notepad ++的DBGp插件可用于繁重的错误查找,而FirePHP则可用于轻量级的东西。又快又脏?没有比dBug更好的了。
PhpEdit有一个内置的调试器,但是我通常最终会使用echo();。和print_r();老式的方式!
好吧,在某种程度上,它取决于事物向南移动的方向。这是我尝试隔离的第一件事,然后根据需要使用echo / print_r()。
注意:你们知道我们可以将true作为第二个参数传递给print_r(),它将返回输出而不是打印输出?例如。:
echo "<pre>".print_r($var, true)."</pre>";
通常,我发现创建一个自定义日志功能,该功能可以保存在文件中,存储调试信息,并最终在通用页脚上重新打印。
我们也可以覆盖通用的Exception类,以便半自动进行这种调试。
如果我们不想弄乱输出,则输出缓冲非常有用。我采用单行代码执行此操作,我可以随意评论/取消评论
ob_start();var_dump(); user_error(ob_get_contents()); ob_get_clean();
PhpEd真的很好。我们可以进入/超过/退出功能。我们可以运行临时代码,检查变量,更改变量。太神奇了
这是我的小调试环境:
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; } } }
只需通过对某些关键变量进行" var_dump"操作即可轻松找到大多数错误,但这显然取决于我们开发的应用程序类型。
对于更复杂的算法,步骤/断点/监视功能非常有用(如果没有必要)
当无法使用Rails时,我经常使用CakePHP。为了调试错误,我通常在tmp文件夹中找到error.log
,并在终端中使用以下命令将其拖尾...
tail -f app/tmp/logs/error.log
它可以让我们从正在运行的蛋糕中运行对话框,这非常方便,如果我们想在中间代码中向其输出内容,则可以使用。
$this->log('xxxx');
通常,这可以使我们对发生的事情/出错的情况有个很好的了解。
我将Netbeans与XDebug和Easy XDebug FireFox加载项一起使用
在调试MVC项目时,该附件是必不可少的,因为XDebug在Netbeans中运行的正常方式是通过url注册dbug会话。在FireFox中安装了添加组件之后,我们将设置Netbeans项目属性->运行配置->高级并选择"不打开Web浏览器"。现在,我们可以像往常一样设置断点并使用Ctrl-F5启动调试会话。打开FireFox,然后右键单击右下角的"加载项"图标以开始监视断点。当代码到达断点时,它将停止,我们可以检查变量状态和调用堆栈。