PHP->调试篇

对PHP调试的一点小心得,尽量写的全了一些,以让后来者少走写弯路,如有错误,尽请斧正

  • 基础调试法/打印变量值

php有几种非常简便的调试,相信大多数人都是知道的,echo,print,print_r,var_dump,var_export
这几种都是php自带的调试方法,非常常用,为了便于理解,所以做成了表格

方法名 类型 描述 返回值
echo 语言结构 只能打印出简单类型变量的值(如int,string) 没有返回值
print 语言结构 只能打印出简单类型变量的值(如int,string) 总是返回1
print_r 函数 可以打印出复杂类型变量的值(如数组、对象)以列表的形式显示,并以array、object开头 如果想捕捉 print_r() 的输出,可使用 第二个(return) 参数。若此参数设为 TRUE,print_r() 将不打印结果,而是返回其输出。
var_dump 函数 可判断多个变量的类型和长度,并输出变量的数值,更适合调试 没有返回值
var_export 函数 和 var_dump() 类似,不同的是其返回的表示是合法的 PHP 代码。 同print_r
dump 函数 大部分框架自带的调试函数,用于var_dump()友好(格式化)的输出,有些框架可能没有 见具体函数
  • 基础调试法/打印脚本运行时间

php的执行速度是非常快速的,往往执行一个脚本的时间不到一秒中,所以如果我们想测试一下执行时间的话,用时间戳就不行了,就要借助一个函数microtime它会返回当前时间戳和微秒数,但是他的格式并不是很方便,我们需要写一个函数方便调试

function get_microtime() 
{
      list( $usec, $sec) = explode(" ", microtime());
      return ((float)$usec + (float)$sec); 
}

然后在开始出调用一次,再在结束前调用此,最后用开始的时间减去结束的时间便可以拿到脚本运行时间

  • 基础调试法/打印脚本运行时间

PHP提供了一个函数可以直接打印出PHP占用的内存量,memory_get_usage,但是返回的单位是字节(byte),这非常不方便我们的调试,于是我们需要一个函数转化单位

function convert($size)
{
    $unit=array('b','kb','mb','gb','tb','pb');
    return @round($size/pow(1024,($i=floor(log($size,1024)))),2).' '.$unit[$i];
}
  • 基础调试法/堆栈追踪(Stack Trace)

PHP提供可以打印堆栈的函数,所谓(堆栈追踪/堆栈打印)就是打印出程序运行到异常时所加载的文件和执行的函数,有了它我们可以很方便的确定是程序在哪里出了问题(特别是在自己不熟悉的项目内)
debug_print_backtrace(),debug_backtrace()
还可以直接调用异常类中的函数

$e = new Exception;  
var_dump($e->getTraceAsString()); 

当然,,大多数框架都会为你集成这个功能,但是掌握此函数会让你更加灵活的利用堆栈去熟悉,调试代码

  • 基础调试法/打印到文件

在很多场景下,比如第三方服务的回调,又或者线上调试时,是不能直接打印出来的,所以我们需要一个能让我们确定程序是否正确运行的但是又不直接打印到页面上的函数

    function mlog(){
        $args = func_get_args();
        foreach ($args as $arg){
            file_put_contents('debug.txt', var_export($arg,true)."\n",FILE_APPEND);
        }
    }

借助于此函数能把变量写到根目录下的debug,txt里面,从而让我们确定程序的执行情况

  • Xdebug简介
    • 下载
      Xdebug是PHP的一个拓展,需要手动去安装并开启,Xdebug是有很多个版本的,很多人第一次装都不知道选什么,导致耽误大量时间,其实是有一个更好的办法的https://xdebug.org/wizard.php, Xdebug的官方提供了一个检测工具,只需要打印出PHP的信息phpinfo(),然后ctrl+c,ctrl+v变回给出适合的版本链接,非常方便.
    • 开启拓展
      下载完成后需要把文件拖入ext文件夹,然后在php.ini文件中加入以下配置,最后勾选拓展,重启服务器,就ok了
[xdebug]
zend_extension ="C:/path/php-7.1.7-Win32-VC14-x64/ext/php_xdebug-2.6.0beta1-7.1-vc14-x86_64.dll" (拓展的绝对路径)
xdebug.remote_enable = 1
xdebug.profiler_enable_trigger = off
xdebug.profiler_output_name = "cachegrind.out.%p"
xdebug.show_local_vars=0
xdebug.remote_autostart=1
xdebug.profiler_enable = off (如果需要生成分析文件进行性能分析的话,设置为on,如果不需要记得设置为off哦,不然会影响性能的)
xdebug.profiler_output_dir ="C:/pach/tmp/xdebug"(生成的分析文件的存放文件夹,不需要可以不设置)
xdebug.trace_output_dir ="C:/pach/tmp/xdebug"(生成的分析文件的存放文件夹,不需要可以不设置)
    • Xdebug的效果(部分)

1.美化var_dump的输出

  1. 更简单的打印脚本运行时间,只用一个函数xdebug_time_index()便可以拿到脚本运行时间

  2. 可以打印内存占用峰值xdebug_peak_memory_usage(),但是单位仍是字节

4.可以进行断点调试

5.更方便的查看堆栈

6.可以进行性能分析 (Profile功能)

    • 关于性能分析
      除了性能分析,其他的功能都可以使用PHP原生实现,但是性能分析的工具(wincachegrind)对windows好像并不是很支持,本猫踩了许多天的坑都没踩出来,于是决定以后再补 (:逃~
create_repo.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,743评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,296评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,285评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,485评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,581评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,821评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,960评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,719评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,186评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,516评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,650评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,329评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,936评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,757评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,991评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,370评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,527评论 2 349