在 NetBeans IDE 中调试 PHP 源代码
准备工作
要在适用于 PHP 的 NetBeans IDE 中成功调试 PHP 应用程序,您需要为进行 PHP 开发安装并配置 PHP 引擎、Apache 本地 Web 服务器和 XDebug 调试器。
启用 XDebug
安装 XDebug 后,您必须在 PHP 引擎中启用它。
启用 XDebug:
- 找到 PHP 引擎所使用的 php.ini 文件。如果运行 phpinfo(),此文件将显示在第一个表中的 "Loaded Configuration File"(已装入的配置文件)表头下。
- 在装入的 php.ini 中取消注释或添加以下行:
- 如果使用 XAMPP 包,则需要禁用 Zend 优化器,因为它会阻止 XDebug。找到相关行,然后删除它们或将其标记为注释。
- /xampplite/php/php.ini
- /xampplite/apache/bin/php.in
zend_extension_ts="<path to the php folder>/php_xdebug-2.0.2-5.2.5.dll"xdebug.remote_enable=1xdebug.remote_host=127.0.0.1xdebug.remote_port=9000xdebug.remote_handler=dbgp有关如何配置 XDebug 的详细信息,请单击此处。
注意:请确保您指定的路径与安装过程中所确定的相应文件的位置匹配。
注意:如果使用 XAMPP Lite,则需要对以下两个 php.ini 文件进行上述更改:
如何使用 XDebug 进行 PHP 调试
如果在 php.ini 文件中启用了 XDebug,XDebug 便可以随时暂停和恢复 PHP 程序执行。当程序执行暂停时,XDebug 可以检索有关当前程序状态的信息,例如读取程序变量的值。实际上,此过程可以用下列工作流来表示:
- 用户在 PHP 源代码执行应该暂停的行上设置一个断点。
- 当到达此行时,用户按 F7 和 F8 键逐行执行脚本,并检查变量的值。
调试器窗口
启动调试会话时,将在主编辑器窗口下打开一组调试器窗口。要添加新窗口,请选择“窗口”>“调试”。可以使用下列窗口:
- “局部变量”窗口,显示已初始化的变量及其类型和值的列表。
- “监视”窗口,显示用户定义的表达式及其值的列表。
- “调用栈”窗口,按倒序显示被调用函数的列表。最后调用的函数将显示在列表顶部。
- “断点”窗口,显示设置了断点的行所在的文件以及行号的列表。
- “会话”窗口,显示当前活动调试会话的列表。
- “线程”窗口
- “源”窗口
- “HTTP 客户端监视器”窗口
调试会话
以下过程是典型调试会话的工作流。
运行调试会话:
- 启动 IDE,运行项目,然后打开包含要调试的源代码的文件。
- 将光标置于某一行上,您希望在该行之前自动执行 PHP 脚本。
- 要设置断点,请按 Ctrl-F8 组合键或选择“调试”>“开启/关闭行断点”。
- 在“项目”窗口中,导航至当前项目节点,单击鼠标右键,然后从弹出式菜单中选择“调试”。IDE 将打开调试器窗口并在调试器中运行该项目,直至到达断点为止。
注意:如果当前项目设置为主项目,则可以选择“调试”>“调试主项目”,按 Ctrl-F5 组合键或单击 。 - 切换至“局部变量”窗口。该窗口显示当前函数中已初始化的所有变量及其类型和值。
- 要查看该函数外部的变量值,请将光标置于此变量出现的某个位置上。工具提示会显示变量值。
- 要逐行(包括所有被调用函数中的行)执行程序,请按 F7 键或选择“调试”>“步入”,然后在“局部变量”窗口中监视这些变量值的更改。
- 要通过监视表达式的更改来检查程序逻辑,请定义一个新监视:
- 要打开“监视”窗口,请选择“窗口”>“调试”>“监视”,或按 Ctrl-Shift-2 组合键。将打开“监视”窗口。
- 在“监视”窗口中的任意位置单击鼠标右键,然后从弹出式菜单中选择“新建监视”。将打开“新建监视”窗口。
- 输入监视表达式,然后单击“确定”。 现在,您便可以在调试过程中进行其他检查。
- 要取消对某个函数中代码的逐行执行操作并跳至该函数调用后的下一行,请按 Ctrl-F7 组合键或选择“调试”>“步出”。
- 要跳过对某个函数中代码的逐行执行操作,获取该函数返回的值,并跳至该函数调用后的下一行,请按 F8 键或选择“调试”>“步过”。
- 要暂停调试会话,请选择“调试”>“暂停”。
- 要继续调试会话,请选择“调试”>“继续”或按 。
- 要取消调试会话,请按 。
-
在程序结束时,调试器窗口会关闭。
样例调试会话
此部分说明了一个标准的调试会话。
- 使用以下参数创建新的 PHP 项目:
- 项目类型 - PHP 应用程序
- 源位置 - htdocs 文件夹的缺省位置
- 运行配置 - 本地 Web 站点
- 在项目创建完成后,将光标置于“源文件”节点上,从弹出式菜单中选择“属性”,然后打开“调试”窗口。选中“调试服务器端 PHP”复选框。
- 要在会话过程中使用热键,请将光标置于项目节点上,然后从弹出式菜单中选择“设置为主项目”。
- 在 index.php 文件中,输入以下代码:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>NetBeans PHP debugging sample</title></head><body><?php $m=5; $n=10; $sum_of_factorials = calculate_sum_of_factorials ($m, $n); echo "The sum of factorials of the entered integers is " . $sum_of_factorials; function calculate_sum_of_factorials ($argument1, $argument2) { $factorial1 = calculate_factorial ($argument1); $factorial2 = calculate_factorial ($argument2); $result = calculate_sum ($factorial1, $factorial2); return $result; } function calculate_factorial ($argument) { $factorial_result = 1; for ($i=1; $i<=$argument; $i++) { $factorial_result = $factorial_result*$i; } return $factorial_result; } function calculate_sum ($argument1, $argument2) { return $argument1 + $argument2; }?> </body></html>
该代码包含三个函数:- calculate_factorial () 函数
- calcualte_sum () 函数
- calculate_sum_of_factorials () 函数,该函数调用 calculate_factorial () 函数两次,再调用 calcualte_sum () 函数一次,然后返回计算的阶乘和。
- 在 PHP 块的开头设置一个断点 (Ctrl-F8):
<?php
- 要启动调试,请单击 。调试器将在断点处停止。
- 按 F7 键三次。调试器将在调用函数 calculate_sum_of_factorials () 的行上停止。“局部变量”窗口会显示变量 $m 和 $n 以及它们的值:
- 要步入函数 calculate_sum_of_factorials (),请按 F7 键。调试器开始执行函数 calculate_sum_of_factorials () 中的代码,然后在函数calculate_factorial () 的调用处停止。
现在,“局部变量”窗口将显示函数 calculate_sum_of_factorials () 中声明的局部变量 $argument1 和 $argument2。 - 按 F7 键。调试器开始执行函数 calculate_factorial () 中的代码。“调用栈”窗口将按倒序显示函数的调用栈,最后调用的函数位于列表顶部:
- 按 F7 键步入循环。可在“局部变量”窗口中查看变量值。
- 如果您确定代码运行正常,请按 Ctrl-F7 组合键取消函数执行。程序将在调用函数 calculate_factorial () 后返回至下一行。
注意:您也可以按 F7 键,直到程序执行完函数 calculate_factorial () 为止。您也会在调用该函数后返回至下一行。 - 由于您刚检查了函数 calculate_factorial (),并且确定其运行正常,因此可以跳过对该函数的再次执行操作(“步过”)。要步过该函数,请按 F8 键。程序将在函数calculate_sum () 的调用处停止。
- 要步入函数 calculate_sum (),请按 F7 键。
- 要步过该函数,请按 F8 键。对于任何一种情况,调试器都会在函数 calculate_sum_of_factorials () 的最后一行停止。
- 按 F7 键。调试器将移到 echo 语句所在的行上。
- 按 F7 键,直到调试器退出程序为止。将打开浏览器窗口并显示程序执行的结果:
使用其他监视
可以定义其他监视表达式来跟踪程序的执行。这有助于捕获错误。
- 按如下所示更新代码(将加号替换为减号):
function calculate_sum ($argument1, $argument2) { return $argument1 - argument2; }
假定运算符的改变是由于拼写错误造成的,而实际上您需要计算和。 - 选择“调试”>“新建监视”或按 Ctrl-Shift-F6 组合键。将打开“新建监视”窗口。
- 输入以下表达式,然后单击“确定”。
$factorial1+$factorial2
“监视”窗口中将显示新表达式。 - 运行调试会话。当调试器在以下行停止时
return $result;
将“监视”窗口中表达式的值与“局部变量”窗口中 $result 的值进行比较。它们应该相同,但在此示例中不同。
此示例非常简单,它为您提供了使用监视的一些基本概念。
PHP 和 HTML 混合用例
您可以调试同时包含 PHP 块和 HTML 块的代码。在样例调试会话部分的示例中,对值进行了固定编码。现在,将通过用于输入值的 HTML 输入表单来扩展该代码。
- 在 <?php ?> 块的上方添加以下 HTML 代码:
<form action="index.php" method="POST"> Enter the first integer, please:
<input type="text" name="first_integer"/><br/>
Enter the second integer, please:
<input type="text" name="second_integer"/><br/>
<input type="submit" name="enter" value="Enter"/>
</form>有关详细信息,请参见 HTML 输入表单。
- 将 <?php ?> 块顶部的以下行:
$m=5; $n=10; $sum_of_factorials = calculate_sum_of_factorials ($m, $n); echo "The sum of factorials of the entered integers is " . $sum_of_factorials;
替换为以下代码:if (array_key_exists ("first_integer", $_POST) &&
array_key_exists ("second_integer", $_POST)) {$result = calculate_sum_of_factorials ($_POST["first_integer"], $_POST["second_integer"]);
echo "Sum of factorials is " . $sum_of_factorials;
} - 在 <?php ?> 块的开头设置一个断点,然后启动调试会话。
- 按 F7 键。调试器将步入程序。同时,会打开浏览器窗口,但不显示输入表单。这是调试器的正确行为,因为它必须首先通过 Web 页的整个源代码,然后才能显示该页面。实际上,这意味着调试器通过了两次代码。第一次是调试器处理代码以显示 HTML 输入表单。第二次是调试器逐步执行 PHP 代码。
- 按 F7 键,直到调试器到达程序末尾并且打开输入表单为止。
- 填写该表单,然后单击 Enter 键。将继续调试会话(如样例调试会话部分中所述)。