设为首页 收藏本站
查看: 1313|回复: 0

[经验分享] 如何调试PHP程序

[复制链接]

尚未签到

发表于 2018-12-21 13:40:36 | 显示全部楼层 |阅读模式
  最简单的谁都会的调试(是么?):
  本来安装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");
  直到确保这个对象工作正常了, 就可以暂时撇开这个对象的代码了, 看看别的东西有没有错误


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-654081-1-1.html 上篇帖子: 国内PHP论坛系统和内容管理系统的发展 下篇帖子: PHP 调用外部系统命令
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表