如何调试Php?

 

最简单的谁都会的调试(是么?):
本来安装php是没问题 也能用了 但是又从书上抄了一些代码来发现不能用, 那就用眼睛仔细的对着书本纠正一下代码哈 肯定是你抄错了 要么是印刷错了
比如 1(yi)跟l(el) 0(ling)跟O(大写o)等

别笑哈 真的有人抄错过 还让我过去帮忙调试 过去我录入进去(他的没保存) 就全对了

言归正传
Q: "为什么要调试?"
A: 当然是因为程序错啦. 你以为我有什么别的答案?
Q: "可是我觉得我的程序应该没错啊!"
A: 不能出来期望的结果 当然是错误发生. 有这种思想的人是根本不具备调试观念 更没有调试能力.
Q: 那调试有什么用?
A: 不管是你配置的php出错 还是你的程序写错 还是你写的正确的程序跟别人配置的php(比如免费空间)犯冲, 学会调试都能找出原因来
Q: 逻辑乱了能调试好么?
A: 或许你偶尔改来改去改好了 以为是调试好了 其实那已经不是单纯的调试, 而是反复的用程序代码进行思考, 并且反复的改代码来"实践"某个idea是否可行.
可以说是"调试逻辑"而非"调试代码":
逻辑没代码或者乱代码--调试/修改逻辑-->正确的逻辑->体现在代码上,出来正确的代码.
单纯的调试代码是:
正确的逻辑--编码-->出错的代码--调试-->正确的代码
所以调试可以分为:
1.调试逻辑, 2.调试代码, 3.调试界面. 4. etc..
错误的逻辑是不可能出来正确的程序. 写程序首先得把逻辑(流程)弄清楚, 然后才开始编码.
合并在一起就是:
含糊的逻辑--调试逻辑-->正确的逻辑--编码-->出错的代码--调试代码-->正确的代阿马
其中调试逻辑你可以利用"修改代码"来辅助 免得脑子太累, 但是脑子必须动, 不能不思考乱改来改去, 而且不能跟 "调试代码" 混在一起.
改小错误 常常混在一起 就解决了, 但是要养成分开的习惯, 对于大错误才能一样轻松解决.

别慌
很初学者 一碰到错误就慌了, 脑子里只知道"不行啊 错了 惨了 找个人问问", 要冷静下来 根据所学的知识去研究, 到底什么是debug, 如何debug, 出错了到底该干什么

基本调试:
1. 打开调试功能: php.ini 里 设置error_reporting = E_ALL以及 display_errors = On 重启 web服务(apache)
2. 刷新错误的页面 查看错误提示 行号 文件名
3. 打开该文件 定位到出错行. 比如代码 echo $abc[2];
4. 理解错误:
a. 查看手册 理解错误含义 要能理解首先要理解语言 比如最简单的 Undefined index 2 意思是数组不存在该下标 也就说明你访问了某个数组不存在的元素
b. 如果已经知道如何改 就直接修改, 比如改成 echo $abc[0];
c. 不知道就显示变量内容 在同样的地方 加入 var_dump($abc); 刷新页面 看看$abc这个东西到底包含了什么元素
d. 认为本该存在 $abc[2]的, 那就寻找错误源, 往上回朔, 或者用 var_dump(debug_backtrace());
必要的时候 var_dump($_POST, $_GET, $_COOKIE, $_SERVER....)

本人未用过单步调试 (step by step) 如果使用调试器相对简单一点 可以暂停下来 看看变量的内容 到底是不是 中应该出现的值, 如果不是 又是哪里产生这个值的


注意留意什么是环境
环境:
为什么全世界那么多人没事就你的有问题? 你的问题爱上了你 还是你爱上了你的问题?
其实"一方水土养一方人", 你的"环境"养你的bug.
平时阅读书本/手册, 注意记录整理什么是"环境".
$_GET $_POST $_COOKIE $_SESSION $_SERVER 这些是程序运行的至关重要因素 当然还包括你自己搞出来的 $GLOBALS, 都可以var_dump他们 看看内容.
还有strtolower/strtoupper之类 跟setlocale()函数有关, 而默认值在linux下跟 getenv("LANG") getenv("LC_ALL") 之类有关(putenv不一定起作用)
还有其他的 比如php.ini的配置.
还有web服务器配置, 比如apache支持某些函数而在别的服务器下就不支持

btw1: 你的调试能力跟你的编码能力是相互相成的, 根据你的编码经验你觉得还有什么该注意的 可以提出来
btw2: 有些你或许觉得很简单很平常, 但是想想你自己是不是真的做到了

 

-------------------------------- 以下内容比较罗嗦
对于你一眼就看出来的问题, 当然可以立即解决, 但是如果没头绪那就参考:
调试的大方向:
抓!
a. 擒贼先擒王, 最大的错误就是逻辑错误, 先审查一边逻辑, 然后才是代码关键的部位(跟错误可能相关的)
b. 顺瓜摸根.., 有果必有因, 知道最终错误的"结果", 顺着摸过去 就能发生错误的"原因", 比如
if ($logined) {
$a = 100;
}
$_SESSION['a'] = $a; 提示Undefined variable $a, 显然要找产生$a变量的地方, 往上找到 if那块 发现只有if true的时候才有$a于是改成
if ($logined) {
$a = 100;
} else {
$a = 0;
}

比如mysql的函数出错 就有好多提示
提示 密码错误: 看看是参数的密码错了 还是mysql服务器设置的密码错了
提示 sql字段不存在, 打开phpmyadmin去表里看看有哪些字段 程序写错了还是忘记添加了 还是搞错表了
提示语句错误, 找mysql手册 而不是php手册

拆!
所谓万众一心 那个什么什么来着, 但是我们是一个人面对的一个"庞大"的代码, 所以要来个"反之亦然", 把错误从代码里分开, 把多个错误拆开. 如此一来, 对于你来说只不过是多个小小的错误, 一个个消灭.

忆:
回想以前是不是碰到类似的错误提示, 那个时候是怎么解决的. 如果没有回想到, 那就应该找新的方法.
对于初学者来说, 反复锻炼很重要, 回忆能加强学过的能力/方法, 直到联会贯通, 应用自如.

对比:
跟本文开头说的差不多, 就是找正确的代码来对比.
有时候是没有相应的正确代码的, 这个时候可以在脑子里重新构思一个正确代码来对比, 有点难 呵呵, 不过这样是避免又照着错误的思路去想
再就是看看手册, 根据手册说明就知道其实应该如何 不该如何.

OO 思路
要求你的程序比较OO(不一定是对象, 但是结构/思路上有oo)
OO编程简单说就是对象化, 每个类型的对象完成某个功能, 就像一只老鼠只需要吃就能活, 一个对象/或者某部分代码 只需要所期望的一些数据就能正常工作.
OO debug法就是首先要有个观念: 我的某个对象(or代码)只需要有一定的数据(环境下)就可以正常工作
如果
1. 有正常的数据也出错 则说明是这个对象设计错了
2. 传入的数据不正常, 则说明使用这个对象的代码调用错了
高手或许觉得这条很"傻", 其实对于初学者(包括以前的我) 要形成这样的观念 以及一直使用这个观念来调试, 却是要到了很久之后 接近高手了 才懂.
有点像'拆'方法 不过区别在于调试的时候:
1. 取对象出来 可以单独调试, 因为好的对象(or代码) 只需要尽量简单的数据, 复杂的数据可能在对象内部或者外部生存, 而不会跨出/入对象(也就是不会传进来 也不会传出去)
2. 对于web要快速调试, 并不一定要把对象的代码全部掏出来, 只需要再调用对象的部分 添加一些用来查看对象语句, 比如var_dump($obj) var_dump($obj->myabc);
或者类似 echo $http->download(); 这样的调用之前 手工设置一些自己熟悉的数据 比如:
$http->setUrl("http://localhost/abc.html");
直到确保这个对象工作正常了, 就可以暂时撇开这个对象的代码了, 看看别的东西有没有错误

<think>嗯,用户现在问的是如何在IntelliJ IDEA中调试PHP代码,步骤和配置方法。之前我回答过如何在IDEA里运行PHP项目,用户可能已经配置好了环境,现在想进一步调试。需要结合之前的回答和引用里的信息,尤其是引用[2]里的Xdebug配置。 首先,用户可能需要先安装Xdebug。引用[2]提到了配置Xdebug的步骤,比如修改php.ini文件,添加DLL路径和参数。不过不同版本的PHP对应的Xdebug版本可能不同,用户需要确认自己PHP版本对应的Xdebug版本,这点可能需要提醒用户检查。 然后是IDEA里的配置,比如在设置里启用Xdebug,指定端口。引用[2]里提到了Debug port的设置,用户需要确保IDEA里的端口和php.ini里的xdebug.remote_port一致,比如9110或者默认的9000。现在Xdebug 3版本后端口可能变了,默认是9003,但用户可能还在用旧版本,所以需要确认。 接下来是配置调试器,用户需要进入PHP设置,选择CLI解释器,并关联Xdebug。引用[2]中的步骤包括在php.ini里添加zend_extension路径,这部分需要详细说明,特别是路径的正确性,用户可能容易出错的地方在这里。 然后创建调试配置,比如PHP Script或者Web应用,根据项目类型不同。如果是Web服务器,可能需要配置服务器映射,确保IDEA能正确映射本地路径到服务器路径,避免断点无法命中。 调试步骤的话,设置断点,启动调试,用浏览器访问触发。引用[2]提到用内置服务器或者外部服务器,用户可能需要配置浏览器扩展,比如Xdebug helper,或者手动添加XDEBUG_SESSION参数。这里需要说明不同情况下的触发方式。 常见问题部分,比如断点不生效,可能原因有端口不匹配、Xdebug未加载、路径映射错误等。需要提示用户检查日志,比如xdebug.log,看是否有连接尝试或错误信息。引用[2]里有配置xdebug.remote_log的路径,用户可以通过查看日志来排查问题。 另外,用户可能遇到Xdebug版本与PHP版本不兼容的问题,需要指导如何选择合适的Xdebug版本。或者环境变量问题,比如使用Docker时可能需要额外的配置。 最后,相关问题可以引导用户了解如何用Composer管理依赖,或者性能优化,但当前问题主要是调试,所以相关问题应该是关于Xdebug配置、断点使用、日志分析等。</think>### 如何在 IntelliJ IDEA 中调试 PHP 代码 #### 一、前期准备 1. **安装 Xdebug 扩展** - Xdebug 是 PHP 调试的核心工具,需与 PHP 版本匹配。 - **Windows**:从 [Xdebug 官网](https://xdebug.org/wizard) 下载对应版本的 `.dll` 文件,放置于 PHP 安装目录的 `zend_ext` 文件夹(例如:`D:\wamp64\bin\php\php7.3.12\zend_ext\`)[^2]。 - **Linux/macOS**:通过包管理器安装(如 `pecl install xdebug`)。 2. **配置 `php.ini`** 在 PHP 配置文件末尾添加以下内容(路径需替换为实际值): ```ini [xdebug] zend_extension="D:\wamp64\bin\php\php7.3.12\zend_ext\php_xdebug-2.8.0-7.3-vc15-x86_64.dll" ; Windows 示例 xdebug.mode=debug xdebug.client_host=127.0.0.1 xdebug.client_port=9003 ; Xdebug 3+ 默认端口为 9003 xdebug.start_with_request=yes ; 自动触发调试 xdebug.log="D:/xdebug.log" ; 调试日志路径(可选) ``` **验证配置**:命令行执行 `php -v`,若输出包含 **Xdebug** 即表示成功[^2]。 --- #### 二、IntelliJ IDEA 配置步骤 1. **启用 Xdebug 调试器** - 打开 `File > Settings > PHP > Debug`: - 设置 **Debug port** 为 `9003`(与 `php.ini` 中的 `xdebug.client_port` 一致)。 - 勾选 **Force break at first line when no path mapping specified**(可选)[^2]。 2. **关联 PHP 解释器** - 进入 `File > Settings > PHP`,确保已选择配置好的 PHP 解释器(包含 Xdebug 扩展)[^1]。 3. **创建调试配置** - **方式 1(脚本调试)**: `Run > Edit Configurations` → 点击 `+` → 选择 **PHP Script** → 指定要调试PHP 文件。 - **方式 2(Web 应用调试)**: `Run > Edit Configurations` → 点击 `+` → 选择 **PHP Web Page** → 配置服务器 URL(如 `http://localhost:8080/index.php`)[^2]。 --- #### 三、调试操作流程 1. **设置断点** 在代码行号左侧单击,添加断点(红色圆点)。 2. **启动调试** - **脚本调试**:直接点击工具栏的 **Debug** 按钮(绿色虫形图标)。 - **Web 调试**: 1. 启动本地 Web 服务器(如 Apache/Nginx 或 IDEA 内置服务器)。 2. 浏览器访问目标 URL,并在请求中添加调试参数(如 `XDEBUG_SESSION=PHPSTORM`),或使用浏览器插件(如 [Xdebug Helper](https://chrome.google.com/webstore/detail/xdebug-helper/eadndfjplgieldjbigjakmdgkmoaaaoc))自动注入参数。 3. **调试控制** - **快捷键**: - `F7`(Step Into) - `F8`(Step Over) - `F9`(Resume Program) - **查看变量**:在 **Variables** 面板中实时监控变量值。 --- #### 四、常见问题解决 1. **断点未触发** - 检查 `php.ini` 中 Xdebug 配置是否生效(通过 `phpinfo()` 页面)。 - 确保端口一致(IDEA 的 `Debug port` 和 `php.ini` 的 `xdebug.client_port`)。 - 验证路径映射:Web 项目需在 `PHP > Servers` 中设置本地路径与服务器路径的映射关系[^2]。 2. **日志分析** 若配置了 `xdebug.log`,可通过日志排查连接失败原因(如端口占用、权限问题)。 --- ### 相关问题 1. 如何解决 Xdebug 连接超时问题? 2. 如何在 Docker 环境中配置 PHP 调试? 3. 如何通过断点条件实现选择性调试? --- **提示**:若需远程调试(如 Docker 或虚拟机),需调整 `xdebug.client_host` 为宿主机的 IP 地址,并开放防火墙端口[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值