PHP 调试指南.pdf

PHP 程序员的调试技术

根据要调试的对象的不同,采取的方法也不一样:

  • 调试 web 应用:对于 web 应用,可以在浏览器中安装插件,或者在 IDE 中设置,下面的设置二选一即可。

    • Get/Post 请求或 Cookie 中添加 XDEBUG_SESSION_START=session_name,使 Xdebug 知道这个请求应该连接 IDE 进行调试。一般由 IDE 提供这个功能。
    • 安装浏览器插件。
  • 调试其他应用:调试命令行程序或者单元测试时,不需要在浏览器中查看效果,则省去了上面的步骤。

下载并开启 Xdebug

通过 Xdebug,可以在 IDE 的终端进行调试,可以单步调试、查看调用栈和变量值。此外,Xdebug 还可以分析性能(XHProf 也可以分析性能)。

Xdebug 支持的功能有:

下载安装

下载地址:https://xdebug.org/download.php

我用的 PHP 是 7.2,64位,非线程安全的版本,所以下载 PHP 7.2 VC15 (64 bit) 这个版本的 Xdebug。

下载完成后,将其放入 PHP 安装目录下的 ext 目录。然后修改 php.ini 文件(或者专门建立独立的 ini 配置文件给 Xdebug 用)添加如下内容:

[Xdebug]
zend_extension="c:/php/ext/php_xdebug-2.1.0-5.3-vc6.dll"
xdebug.remote_enable=true
xdebug.remote_host=127.0.0.1
xdebug.remote_port=9001

通过命令行执行 php -v,输出中包含 Xdebug 的版本信息,则表示安装成功:

C:\Users\Administrator>php -v
PHP 7.2.7 (cli) (built: Jun 19 2018 23:13:48) ( NTS MSVC15 (Visual C++ 2017) x64 )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
with Xdebug v2.7.0alpha1, Copyright (c) 2002-2018, by Derick Rethans

注意,[Xdebug] 在 Linux 需要区分大小写。

设置 Xdebug

Xdebug 是 C/S 结构,Client 是 PHP 中安装的 Xdebug,Server 是 IDE 中安装的插件。PHP 脚本运行时,Xdebug 可以向 IDE 报告运行状态,并将调试信息发送给 IDE。

Xdebug 有大量的配置参数可以设置,完整设置可以参考 这里,常用设置如下:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;远程调试相关设置
;用于验证服务器,只有 Xdebug 的服务器与客户端的 idekey 匹配时才会发送调试消息
xdebug.idekey="PhpStorm"
;开启远程调试
xdebug.remote_enable=on
;自动启动远程调试,对于不是 web 应用的 PHP 程序来说,必须开启
xdebug.remote_autostart=on
xdebug.remote_mode="req"
xdebug.remote_log="d://lnmp/log/phpxdebug.log"
xdebug.remote_handler="dbgp"
;远端 Xdebug 服务器的 IP 地址
xdebug.remote_host=localhost
;远端 Xdebug 服务器的端口,在 IDE 中设置
xdebug.remote_port=9001 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;trace 代码跟踪相关设置
;是否允许Xdebug跟踪函数调用,跟踪信息以文件形式存储,默认值为0。用于调试 auto_prepend_file 中的代码
xdebug.auto_trace = 1
;代码跟踪日志文件位置,默认值为/tmp。需要先新建这个目录,并设置读写权限
xdebug.trace_output_dir=d://lnmp/log/php
;函数调用跟踪信息输出文件命名规则,默认为 trace.%c
xdebug.trace_output_name=trace.%c.%p
;是否允许 Xdebug 跟踪函数参数,默认值为0
xdebug.collect_params = 4
xdebug.collect_includes = On
;是否允许 Xdebug 跟踪函数返回值,默认值为0
xdebug.collect_return = On
xdebug.show_mem_delta = On
;设置数组或者对象显示的最大层级,默认是3
xdebug.var_display_max_depth = 2 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;profile 性能探查相关设置
;打开性能分析器,默认值为0
xdebug.profiler_enable=1
;性能分析文件的存放位置,默认值为/tmp。需要先新建这个目录,并设置读写权限
xdebug.profiler_output_dir=d://lnmp/log/php
;性能分析文件的命名规则,默认值为cachegrind.out.%p
xdebug.profiler_output_name=profiler.%c.%p

配置 IDE(以 PhpStorm 为例)

PhpStorm 设置项参考手册

调试非 web 应用

PHP 中的 Xdebug 配置完成后,接下来需要在 IDE 中设置 Xdebug 服务器,通过监听端口来获取代码运行状态。

添加 PHP 解释器

设置的路径:打开 IDE 后,依次选择 File | Settings | Languages & Frameworks | PHP,选择 PHP 版本和脚本位置即可。

设置 Xdebug

设置的路径:打开 IDE 后,依次选择 File | Settings | Languages & Frameworks | PHP | Debug,可以看到 Debug 相关设置。最重要的是端口号,默认是 9000,但这会跟 PHP-FPM 冲突,所以这里改为 9001。同时,需要在 php.ini 配置文件中通过 xdebug.remote_port=9001 告诉 Xdebug 客户端,服务器监听的端口号是 9001。

当前设置页面的参考手册在 这里

调试 web 应用

Debugging PHP Web Applications with Run Debug Configurations

PhpStorm 中可以通过 Run | Edit Configuration 进入 Run/Debug Configuration 调试设置页面,在这里添加测试项目后,点击调试按钮后,IDE 会自动打开浏览器,输好网址并添加这个字符串 XDEBUG_SESSION_START=session_name

设置 Xdebug 代理

字段 描述
IDE key 指定代理服务器的名称以标识 IDE 中的连接。这应该是当前活动的 php.ini 配置文件中 xdebug.idekey 设置的值。
Host 指定 Xdebug 代理服务器所在的主机。
Port 指定在代理调试会话期间 PhpStorm 将侦听的端口。

配置 debug 参数

配置浏览器

Xdebug 和 IDE 配置完成后,就可以调试非 web 应用了。对于需要在浏览器中调试的 web 应用,还需要在浏览器中安装插件,Chrome 直接安装 Xdebug Helper 就行了,其他浏览器可以参考 这里

插件安装好后,打开 PhpStorm 并监听 debug 连接(Run | Start Linstening for PHP Debug Connections,也就是调试工具栏中的小电话)。然后点击刚安装好的插件,选择 debugging、profiling 或 tracing 会话,在浏览器端初始化一个连接。

PHP 调试 - Xdebug的更多相关文章

  1. ref:phpstorm配置远程调试(xdebug)(docker中)

    ref:https://www.cnblogs.com/yjken/p/6555438.html readme:本文设置远程调试ubuntu中的php代码. 在docker中也可以,经过测试phpin ...

  2. phpstorm中配置真正的远程调试(xdebug)

    这里说的是真正的远程调试,不是本地,本地不需要安装任何php程序!!! 这里略去xdebug的安装,安装很简单可以下载源码包,动态编译进去! 环境: Dev 服务器(IP:192.168.2.100) ...

  3. zend studio配置调试(Xdebug方式)

    1.下载xdebug http://xdebug.org/download.php 我下的是PHP 5.4 VC9 (32 bit) [当前系统php是php5.4.14(win32)版本] 2.配置 ...

  4. php程序调试: xdebug的配置

    怎样在phpeclipse中像调试Java程序一样调试php呢? XDebug的版本号非常多,打开http://xdebug.org/index.php.把站点细致看一下,你会发现有句"If ...

  5. 不用print调试 xdebug ubuntu phpstorm 远程断点调试

    即使这会写php也遵守zebra大人的指示:不用print调试!!!!----环境ok  ---gan !!! w http://blog.csdn.net/ty_hf/article/details ...

  6. phpstorm+xdebug, 实现断点调试: xdebug如何配置

    [XDebug] xdebug.profiler_output_dir="D:\phpStudy\tmp\xdebug" xdebug.trace_output_dir=" ...

  7. Xdebug文档(七) 远程调试

    Xdebug提示调试客户端接口与PHP运行相联系.该章节解释如何设置PHP与xdebug,并推荐一些客户端. 介绍 Xdebug的远程调试器允许你检查数据结构,交互式地穿过和调试你的代码.该协议已经开 ...

  8. 用netbeans和xdebug调试php的配置

    xdebug的chrome.firefox插件 chrome:Xdebug helper firefox:easy Xdebug ----------------------------------- ...

  9. PHP使用Xdebug进行远程调试

    PHP使用Xdebug进行远程调试 翻译 by mylxsw posted on 2014/07/14 under 技术文章 > 编程语言 Xdebug提供了客户端与PHP脚本进行交互的接口,这 ...

随机推荐

  1. VS2017运行emwin模拟机不能运行的解决部分

    宇宙第一开发工具的功能太强大了,今天我们来介绍怎么解决VS2017的C++功能运行emwin模拟机不能运行的解决部分 编译软件:Visual Studio 2017:     emwin模拟机版本:S ...

  2. Java7/8 中的 HashMap 和 ConcurrentHashMap 全解析 (转)

    阅读前提:本文分析的是源码,所以至少读者要熟悉它们的接口使用,同时,对于并发,读者至少要知道 CAS.ReentrantLock.UNSAFE 操作这几个基本的知识,文中不会对这些知识进行介绍.Jav ...

  3. 深入浅出Oracle数据读取一致性和事务表

    保证Oracle数据库读取一致性的关键是SCN.每一个数据块头都会记录一个事务提交的SCN.同时每一数据块头都包含一个事务表(ITL),事务必须获得一个ITL事务表才能进行数据修改.该事务表用来确定当 ...

  4. controller函数中参数列表使用多个@RequestBody

    首先出现这种情况是因为有下面这种需求 $.ajax({ type: "POST", url: "${pageContext.request.contextPath}/co ...

  5. Ftp客户端(上传文件)

    #coding=utf-8 import os import socket import hashlib import json # client = socket.socket() #申明socke ...

  6. Python之路-函数基础&局部变量与全局变量&匿名函数&递归函数&高阶函数

    一.函数的定义与调用 函数:组织好的.可重复使用的.用户实现单一或者关联功能的代码段.函数能够提高应用的模块性和代码的重复利用率.Python提供了很多内置的函数,比如len等等,另外也可以根据自己的 ...

  7. Hibernate Validation与Spring整合各注解的用法Demo

    转自:https://www.aliyun.com/jiaocheng/1315650.html <dependency> <groupId>org.hibernate< ...

  8. Photoshop画笔工具的使用

    现在我们按下[B]从工具栏选择画笔工具,如果选中了铅笔就[SHIFT B]切换到画笔.然后按下[D],它的作用是将颜色设置为默认的前景黑色.背景白色.也可以点击工具栏颜色区的默认按钮(下左图红色箭头处 ...

  9. arm算力

    arm 算力运算 MIPS: Million Instructions executed Per SecondDMIPS: Dhrystone Million Instructions execute ...

  10. 免插件,简单实现上拉加载loading

    上拉加载是前端经常遇到的问题,采用插件往往能够轻松解决,这里介绍一种免插件简单实现上拉加载的方法,参考一下,下面分享一下代码. html <body> <ul> <li& ...