Heim >Backend-Entwicklung >PHP-Tutorial >php程序调试方法总结_PHP教程

php程序调试方法总结_PHP教程

WBOY
WBOYOriginal
2016-07-20 11:17:25890Durchsuche

   相信很多朋友们都有调试程序的经历,然而很多时候调试程序是痛苦而又漫长的过程;它不仅需要细心,更需要耐心,切忌心浮气躁。但是当找出问题并顺利解决它时,又会给人无比激动的喜悦。这里总结一下笔者在程序调试中的使用的原则,工具,以及方法。这里需要说明的是,某些原则性的东西,各种语言都是差不多的,而涉及到具体的工具和某些具体的调试方法,这里只涉及web开发方面的内容。

  总体原则:

  1.找出问题原因:

  程序需要调试,是因为程序有问题。而调试的第一目标是找到原因。常见调试方法, 排除法: 当我们面对整个复杂的系统时,常常完全不知道问题出在什么地方;这个时候可以先将与问题不相关的地方排排除,逐渐缩小调试范围。独立模块法: 大部分程序都有模块结构,将可疑模块单独拿出来,模拟输入相应的操作数据,看是否出现问题。比较法:如果程序或系统是基于某个平台时,可以先看看其他基于本平台的程序或系统,找出是平台问题还是本程序问题,很多时候这种方法是用来排除不成熟平台上的隐藏问题。对比法:对于自己实现的程序,可能已经有相应的开源的模块,可以把这些程序源码找出来,和自己的程序进行对比,这样不仅节省时间,还能借鉴别人的优秀之处。

  2.问题定位:

  问题原因的多种多样,可能这个时候你只能知道是什么样的问题, 可能与什么相关, 这个时候就需将出现的代码段找出来。而需要做到这一步,一般开发环境为我们提供很多实用工具,借助这些工具,可以一步一步地查看程序的输入和输出,根据每一步的输入输出,定位问题。

  有一部分很厉害的人,可以通过阅读代码,找到出现问题的地方。但是很多问题都是调试者自己因为疏忽造成的,而要通过这样方式去查找问题,几乎是不可能的,因为已经形成固定的思维定势。

  3.解决问题

  找到问题的原因和相应代码行,解决它很多时候是一件比较简单的事,因为这些问题往往自己疏忽或者自己考虑不周。但是某些时候并不总是这样的,而是由于外部环境造成的,比如你的网站访问的人数增多,你当初没有考虑到这些数据压力,同时也没有考虑到高度并发性的问题,这个时候问题解决起来是你觉得比较棘手。而要解决这样的问题,不仅仅要专注程序, 更要从系统架构方面着手,综合各方面的知识,进行全面的考虑。

  web开发常用调试工具

  俗话说:工欲善其石,必先利其器。对于程序的调试,也必须借助外部工具。这里介绍几种在开发web程序中常常用到的工具:

  xdebug, xhprof:php性能调试工具。他们都是php的一种扩展,可以很方便的安装和配置。这两个工具主要是将你程序的内部运行状况,调用函数以一种简洁的方式告诉你。让你对程序在什么地方占用过多的资源,那些地方需要进行优化一目了然。 顺便提一下,xdebug生成的profile文件一般借助winCacheGrid查看。

  firephp, firbug: 前者主要是php的调试工具,而后者是web开发必不可少的工具, 它不仅能查看请求,还能调试js,css。

  在ie下面可以使用HttpWatch。如果需要将数据做深入分析,可以使用抓包工具。

  php中常使用的调试函数:error_report, var_dump, print_r, var_export

  mysql,apache/nginx的常用的调试技巧:分析他们日志文件也是相当重要。在linux下查看日志文件的常用命令: cat, more, less, grep, awk, sed

  常见的调试技巧和方法

  下面以我调试的程序来介绍一下具体的调试方法和技巧。

  例子1: 这是一个php开发的游戏引擎,主要功能提供双发球员移动位置,状态,传球,技能等功能控制,整个程序通过xml文件保存结果。突然某天,有两个用户进行比赛,返回的xml不符合正常的结构。从返回的结果来看,球员的移动位置有些不正常,其中少了某些步骤,于是决定从游戏的AI入手查找,但是也没有发现此处有什么异常。最后将输入的球员数据打印出来,然后将中间产生的数据也打印出来,结合程序的处理逻辑,发现是这两个用户有同一个球员,因此导致在处理的时候, 两个人的球员出现混乱。找到原因后,就将这个以球员标识改为以球队和球员共同决定即可。

  例子2:程序刚上线, 有些热心的朋友们喜欢对程序进行一些压力测试。某次突然20w的请求很大的一个静态资源,直接导致硬盘瘫痪。对于这种情况,必须查看访问日志,才知道发生什么事。否则人家对你攻击了, 你还找不到原因。当然对于这样的攻击,直接把静态资源放到cdn上。另外,随着访问用户量的增大,系统的压力增大, 反应逐渐变慢,我们不得不考虑:以前只需要0.000几毫秒能处理的程序,现在需要0.几秒。这个时候程序的并发性设计就很重要了。否则会造成数据异常的情况。

  例子3:使用外部软件出现异常:例如使用memcached的时候,如果某台没有启动或者不能使用了。这个时候nginx一般就会对某些使用memcache的请求返回502,是不是感觉有点无厘头,可以考虑改写memcahce 的php扩展了

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/371989.htmlTechArticle相信很多朋友们都有调试程序的经历,然而很多时候调试程序是痛苦而又漫长的过程;它不仅需要细心,更需要耐心,切忌心浮气躁。但是当...
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn