老法师谈技术 :PHP简单粗暴调试

大型服务器端程序的调试方法跟运行在个人电脑或者手持设备的程序的调试思路完全不一样,主要体现在下面几点:

  • [ ] 服务器端一般是一个受限的环境,你无法安装你所需要的所有工具和依赖的库
  • [ ] 服务器程序的Bug跟某些特定逻辑相关,这个特定逻辑可能你还未知,或者在自己PC上面很难模拟触发(比方说大容量访问的时候)
  • [ ] 触发机制,你总是希望在错误发生的时候,能够获取系统的关键信息用以辅助定位问题
  • [ ] 既能够自动保存关键信息,但是对现有系统的性能有较小影响

所以,对于上诉的需求,你需要一个可配置的轻量级调式方法(库)来帮助你定位php系统的问题,xdebug是一个不错的选择。

  1. 以ubuntu为例,安装xdebug
apt-get install php70-debug

当然如果你的系统不是ubuntu,你可以到xdebug官网上面去寻找对应的版本。

  1. 配置xdebug

    xdebug有非常丰富的配置选项,我们从最简单的开始

    zend_extension = "xdebug.so"  
    xdebug.auto_trace = 0
    xdebug.show_exception_trace = 0  
    xdebug.collect_vars = 1  
    xdebug.collect_return = 1  
    xdebug.collect_params = 4  
    xdebug.trace_output_dir = "/tmp/xdebug"  
    xdebug.profiler_append = 0  
    xdebug.profiler_enable = 1  
    xdebug.profiler_enable_trigger = 0  
    xdebug.profiler_output_dir = "/tmp/xdebug"  
    xdebug.profiler_output_name = "cachegrind.out.%t-%s"  
      
    

    xdebug.auto_trace = 1 这个参数要慎用,这个是xdebug会自动跟踪错误,但是在绝大部分过程中,会导致额外的问题。

    xdebug的配置文件放在/etc/php7/mods-available/xdebug.ini

  2. var_dump

    var_dump的价值很大程度上被新手低估,实际上var_dump有可能是你的第一(唯一)选择,php是一个动态语言,并不需要编译就可以运行,这里使得调试就非常的方便,通过var_dump来获取一些关键信息,缩小故障范围就非常有效。这里提及var_dump的原因是这个函数是php本身就支持的,但是自带的版本非常不适合阅读,在安装了xdebug之后,xdebug会格式化var_dump的输出,可阅读性大大增加。var_dump的使用非常简单:

    var_dump($this);
    

    在浏览器里面的可能输出:

    object(main)[19]
      public 'user_id' => int 1
      public 'user_info' => 
        array (size=57)
          'uid' => int 1
          'user_name' => string 'user1' (length=9)
          'email' => string 'user@aaa.com' (length=21)
          'mobile' => null
          'password' => string 'd55ca4ba28f97df06702c339edce8309' (length=32)
          'salt' => string 'wlxb' (length=4)
          'avatar_file' => null
          'sex' => null
          'birthday' => null
          'province' => null
          'city' => null
          'job_id' => int 0
          'reg_time' => int 1478519086
          'reg_ip' => int 2886795265
          'last_login' => int 1479277954
          'last_ip' => int 2886795265
          'online_time' => int 41488
          'last_active' => int 1479277989
    
  3. 使用Log

    在调试服务器端程序的时候,Log是最为基础同样也是最为重要的工具,Log可以帮助你记录事件发生前后发生的事件,帮助你定位问题,几乎所有的复杂问题调查都是从分析Log开始的。下面几个参数跟trace的输出结果相关。

    xdebug.collect_vars = 1 
    xdebug.collect_return = 1  
    xdebug.collect_params = 4  
    xdebug.trace_output_dir = "/tmp/xdebug"
    

    都比较好理解,xdebug.collect_params = 4 设定用于trace的输出方式,可以选择1-4,下面以4举例:

    TRACE START [2007-05-06 14:37:16]
        0.0003     114112   -> {main}() ../trace.php:0
        0.0004     114272     -> str_split('Xdebug') ../trace.php:8
        0.0007     117424     -> ret_ord($c = 'X') ../trace.php:10
        0.0007     117584       -> ord('X') ../trace.php:5
        0.0009     117584     -> ret_ord($c = 'd') ../trace.php:10
        0.0009     117584       -> ord('d') ../trace.php:5
        0.0010     117584     -> ret_ord($c = 'e') ../trace.php:10
        0.0011     117584       -> ord('e') ../trace.php:5
        0.0012     117584     -> ret_ord($c = 'b') ../trace.php:10
        0.0013     117584       -> ord('b') ../trace.php:5
        0.0014     117584     -> ret_ord($c = 'u') ../trace.php:10
        0.0014     117584       -> ord('u') ../trace.php:5
        0.0016     117584     -> ret_ord($c = 'g') ../trace.php:10
        0.0016     117584       -> ord('g') ../trace.php:5
        0.0019      41152
    TRACE END   [2007-05-06 14:37:16]
    

在php代码中使用,记得这个要成对使用,否则长期运行trace会导致系统性能问题(特别是磁盘)

string xdebug_start_trace( [ string trace_file [, integer options] ] )
string xdebug_stop_trace()

如果xdebug.collect_vars = 1 开启变量打印功能,常用的函数有下面几种:

void xdebug_debug_zval( [string varname [, ...]] )
void xdebug_dump_superglobals()
array xdebug_get_declared_vars()

详细的参数说明可以参考xdebug的网页,如下:

https://xdebug.org/docs/execution_trace

  1. 如何更好的查看Log

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

推荐阅读更多精彩内容