在建立PHP开发调试环境时,经常会遇到xdebug无法成功安装的问题,其实主要原因有两点:
1. xdebug版本和php版本不匹配
2.xdebug和 zend不能同时运行,需要在php.ini中禁掉zend配置
针对第一个问题的解决方案,可是使用xdebug官方提供的URL来自动检查与您server php环境相匹配的xdebug版本。
-
首先确保web server可以正常运行
-
在Browser中查看phpinfo,URL:http://127.0.0.1/phpinfo
-
在Browser中右键,查看源代码,拷贝phpinfo的源代码
-
将phpinfo源代码全部copy到上面的页面里的输入框中
-
最后点击页面最下方的"Analyse my phpinfo() output" 按钮
-
最后将会看到我们的系统环境中需要安装哪个版本的php xdebug dll的版本
php.ini文件中关于xdebug的配置如下:
- [Xdebug]
- zend_extension="xbug dll路径"
- xdebug.auto_trace = On
- xdebug.show_exception_trace = On
- xdebug.remote_autostart = On
- xdebug.remote_enable = On
- xdebug.remote_host = 127.0.0.1
- xdebug.remote_port = 9000
- xdebug.remote_handler = dbgp
- xdebug.profiler_enable = on
- xdebug.profiler_output_dir="日志路径"
完整配置及解析:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
xdebug.auto_trace=1 xdebug.default_enable = 1 ;最大递归数 xdebug.max_nesting_level=100 ;重写var_dump() xdebug.overload_var_dump = On ;当这个参数被设置为1时,即使捕捉到异常,xdebug仍将强制执行异常跟踪当一个异常出现时 xdebug.show_exception_trace=1 xdebug.show_local_vars = 1 xdebug.collect_params=On xdebug.collect_return=On xdebug.collect_vars=On xdebug.profiler_enable_trigger=On xdebug.profiler_append = 0 xdebug.profiler_enable = 1 xdebug.dump_once = On xdebug.dump_globals = On xdebug.dump_undefined = On xdebug.dump.REQUEST = * ;xdebug.dump.SERVER = * xdebug.dump.SERVER = REQUEST_METHOD,REQUEST_URI,HTTP_USER_AGENT |
所有配置文件
xdebug.auto_trace
类型: boolean(布尔型), 默认值: 0
当开启这项配置时,在脚本运行之前,对函数调用的追踪就会启用.这使得开发者可以在auto_prepend_file文件中追踪脚本.
xdebug.cli_color
类型: integer(整型), 默认值: 0, 在Xdebug 2.2
如果这项被设置为1, 当使用CLI模式并且输出端是打字机时,Xdebug将会为变量信息和堆栈轨迹输出添加颜色. 在Windows系统下, ANSICON工具需要被安装.
如果这项被设置为2, Xdebug将始终为变量信息和堆栈轨迹输出添加颜色, 不管它是否连接到一台打字机也不管ANSICON是否被安装. 在这种情况下, 你可能会停止转义代码.
查看这篇文章以获取更多细节.
xdebug.collect_assignments
类型: boolean(布尔型), 默认值: 0, 在Xdebug 2.1
此项,默认为0, 控制Xdebug是否应该对函数轨迹添加变量分配追踪.
xdebug.collect_includes
类型: boolean(布尔型), 默认值: 1
此项,默认为1, 控制Xdebug是否应该将在include(), include_once(), require()或require_once()函数中使用的文件名写入追踪文件。
xdebug.collect_params
类型: integer(整型), 默认值: 0
此参数,默认为0,当在函数轨迹或堆栈轨迹中记录一个函数调用时,控制Xdebug是否应该搜集传递给函数的参数
默认值为0,因为对于大脚本来说,它可能消耗大量的内存而使脚本无法运行。启用该选项是安全的,但是如果脚本中含有大量函数调用或者有大数据结构作 为参数的话,可能会遇到一些问题。 Xdebug 2改进了内存使用,此问题不再存在,因为它不再将这些信息存储在内存中。相反,Xdebug会将这些信息写入硬盘,这意味着你得留意硬盘使用量。
此参数用4个不同的可选值,每个不同的值都会对应显示不同的信息。以下你将看到每个参数值所提供显示的信息,查看章节堆栈轨迹以获取详细介绍。.
值 | 显示的信息 |
---|---|
0 | 无 |
1 | 变(常)量类型和长度(大小)(如string(6), array(8))。 |
2 | 变(常)量类型和长度(大小), 含有用以显示完整信息的帮助工具1。 |
3 | 完整变量内容(包括通过xdebug.var_display_max_children, xdebug.var_display_max_data和xdebug.var_display_max_depth参数设置的限制信息。 |
4 | 完整变量内容和名称。 |
1 在带有CLI的PHP版本中,将不会拥有帮助工具,在输出文件中同样也没有。
xdebug.collect_return
类型:boolean(布尔型), 默认值:0
此设置,默认值为0,控制Xdebug是否应该将函数调用的返回值写入轨迹文件。
xdebug.collect_vars
类型: boolean(布尔型), 默认值: 0
这个设置告诉Xdebug来搜集在一定范围内使用的变量的信息。这一过程很慢,因为Xdebug必须对PHP的opcode数组进行反向工程。这个设置不会记录不同变量的变量值,如果需要记录变量值,可以使用xdebug.collect_params。只有当你希望使用xdebug_get_declared_vars()参数时,xdebug.collect_params才需要被启用。
xdebug.coverage_enable
类型:boolean(布尔型), 默认值: 1, 在Xdebug 2.2 版中引进
如果此项设置为0,Xdebug将不会建立内部结构来支持代码作用域。这将使Xdebug的运行速度稍微加快,当然 代码作用域分析也将不起作用。
xdebug.default_enable
类型: boolean(布尔型), 默认值: 1
如果这项被设置为1, 在发生错误事件时,将默认显示堆栈轨迹. 你可以通过在代码中使用xdebug_disable()来禁用显示堆栈轨迹. 由于这是Xdebug的基本函数之一,所以最好使用其默认值。
xdebug.dump.*
类型: string(字符串), 默认值: Empty
* = COOKIE, FILES, GET, POST, REQUEST, SERVER, SESSION。这7个参数控制当错误情况发生时,显示哪些超全局变量。在php.ini设置中,要显示的超全局变量之间用逗号隔开,但是要确保没有添加 空格。如果要在错误发生时显示REMOTE_ADDR和REQUEST_METHOD,添加如下设置:
xdebug.dump.SERVER = REMOTE_ADDR,REQUEST_METHOD
xdebug.dump_globals
类型: boolean(布尔型), 默认值: 1
控制是否显示由xdebug.dump.* 参数指定的超全局变量的值。
xdebug.dump_once
类型: boolean(布尔型), 默认值: 1
控制是对所有的错误情况(设置为0)都显示超全局变量的值还是只对第一个发生的错误情况(设置为1)显示超全局变量的值。
xdebug.dump_undefined
类型: boolean(布尔型), 默认值: 0
如果你想显示超全局变量中未定义的值,你应该将此项设置为1,否则使用默认值。
xdebug.extended_info
类型:integer(整型), 默认值: 1
控制Xdebug是否应该为PHP语法解析强制使用’extended_info’模式; 这将允许Xdebug使用远程调试器设置文件/行断点.当对脚本进行追踪或者效能分析时,你通常会想要关闭该选项,因为PHP生成的op数组将 不断增大,而它作为你脚本的第三方将降低脚本的执行效率。此设置项不能通过ini_set()函数进行设置, 而只能通过php.ini.
xdebug.file_link_format
类型: string(字符串), 默认值: , 在Xdebug 2.1 版中引进
此设置控制在堆栈轨迹显示中的超链接格式,堆栈轨迹中使用了文件名称。它将允许IDE来建立一个链接协议,通过点击Xdebug显示在堆栈轨迹中的文件名能够直接跳转到指定的行和文件。 链接格式可能是这种形式:
myide://%f@%l
可用的格式操作符有:
操作符 | 意义 |
---|---|
%f | 文件名 |
%l | 行号 |
如果要在linux下使用火狐浏览器,请遵循以下步骤:
- 打开about:config
- 添加一个boolean(布尔型)设置”network.protocol-handler.expose.xdebug”
- 将下面的代码写入一个shell脚本”~/bin/ff-xdebug.sh”:
#! /bin/sh f=`echo $1 | cut -d @ -f 1 | sed 's/xdebug:////'` l=`echo $1 | cut -d @ -f 2`
再添加以下的其中一行(取决与你用komodo还是gvim):
-
komodo $f -l $l
gvim --remote-tab +$l $f
- 使用
chmod +x ~/bin/ff-xdebug.sh
命令让脚本可执行 - 将xdebug.file_link_format设置为
xdebug://%f@%l
Windows and netbeans
- 创建一个名为
netbeans.bat
的文件并且将其保存到你的路径中(如:C:Windows
):@echo off setlocal enableextensions enabledelayedexpansion set NETBEANS=%1 set FILE=%~2 %NETBEANS% --nosplash --console suppress --open "%FILE:~19%" nircmd win activate process netbeans.exe
注意: 如果你没有
nircmd
,移除最后一行. - 将一下的代码保存为
netbeans_protocol.reg
文件:Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT etbeans] "URL Protocol"="" @="URL:Netbeans Protocol" [HKEY_CLASSES_ROOT etbeansDefaultIcon] @=""C:\Program Files\NetBeans 7.1.1\bin\netbeans.exe,1"" [HKEY_CLASSES_ROOT etbeansshell] [HKEY_CLASSES_ROOT etbeansshellopen] [HKEY_CLASSES_ROOT etbeansshellopencommand] @=""C:\Windows\netbeans.bat" "C:\Program Files\NetBeans 7.1.1\bin\netbeans.exe" "%1""
注意: 确保你将路径修改到Netbeans的安装目录 (两次),同时也要 修改
netbeans.bat
补丁文件的路径,如果你将其保存在C:Windows
之外的目录. - 双击
netbeans_protocol.reg
文件来将其导入注册表. - 将xdebug.file_link_format的值设置为
xdebug.file_link_format = "netbeans://open/?f=%f:%l"
xdebug.idekey
类型:string(字符串), 默认值: *complex*
控制Xdebug应该将哪个IDE键传递给DBGp调试器助手. 默认值是基于环境变量的. 首先会查询环境变量的DBGP_IDEKEY设置, 然后是USER,最后是USERNAME.默认被设置为第一个被找到的 环境变量的值. 如果没有查询到任何值,默认值为”.如果此项被设置,它通常会覆盖环境变量的值.
xdebug.manual_url
类型: string(字符串), 默认值: http://www.php.net
xdebug信息中有关函数和错误信息的超链接将直接链接到PHP帮助手册中的函数页面。最好将此项设置为最近的镜像。
xdebug.max_nesting_level
类型: integer(整型), 默认值: 100
用来控制对无限递归的保护机制。 此项的值限制了在脚本中断之前,运行嵌套执行的函数的最大数目(即最大递归次数,超过这个数,php脚本将中断执行)。
xdebug.overload_var_dump
类型: boolean(布尔型), 默认值: 1, 在Xdebug 2.1 版中引进
默认情况下,当php.ini的html_errors设置为1时,Xdebug将使用重载的var_dump()函数来显示变量信息。如果你不想这样,那么你可以把此项设置为0,但是在此之前你有必要先检查,确保没有关闭html_errors。
xdebug.profiler_append
类型:integer(整型), 默认值: 0
当此选项设置为1, 在一个新的请求被映射到相同的文件(依赖于xdebug.profiler_output_name的设置)时,效能分析文件的内容不会被覆盖。新的内容将会被追加到原文件的最后。
xdebug.profiler_enable
类型:integer(整型), 默认值: 0
启用Xdebug的效能分析器,效能文件被创建在 profile output directory目录. 这些文件可以被 KCacheGrind读取以呈现在你面前。此指令不能在脚本中通过ini_set()来设置,如果你想有选择的启用效能分析, 请设置xdebug.profiler_enable_trigger为1,不要使用此指令。
xdebug.profiler_enable_trigger
类型:integer(整型), 默认值: 0
当此选项设置为1,通过使用XDEBUG_PROFILE作为GET/POST参数,或者以XDEBUG_PROFILE作为名称来设置一个cookie,你可以触发生成效能分析文件。 这样,效能数据将会被写入defined directory目录. 如果不想为每一个请求都生成效能分析文件,你需要将 xdebug.profiler_enable设置为0.
xdebug.profiler_output_dir
类型:string(字符串), 默认值: /tmp
效能分析器的输出信息将被写入的目录,确保执行PHP脚本的用户拥有对目录的写权限。这条指令不能通过 ini_set()函数设置。
xdebug.profiler_output_name
类型:string(字符串), 默认值: cachegrind.out.%p
这项设置决定被用来转存效能信息文件的名称。它通过格式操作符来鉴别名称格式,跟 sprintf()和strftime()函数类似。有若干格式操作符可以被用来格式化文件名称。
查看xdebug.trace_output_name的介绍来详细了解格式操作符。
xdebug.remote_autostart
类型:boolean(布尔型), 默认值: 0
通常,你需要使用一个指定的HTTP GET/POST变量来启动远程调试 (s查看远程调试). 当此项被设置为1时,Xdebug将会尝试启动远程调试会话并且连接一个客户端 , 即使GET/POST/COOKIE变量不存在.
xdebug.remote_connect_back
类型:boolean(布尔型), 默认值: 0, 在Xdebug 2.1 版中引进
如果启用该配置, xdebug.remote_host设置将被忽略, Xdebug将尝试连接至发起HTTP请求的客户端 .它会检查$_SERVER[‘REMOTE_ADDR’]变量来查找该使用哪个IP地址. 请注意不能使用no值来过滤 , 任何能够连接到web服务器的人都可以启动调试会话,即使他们的地址跟 xdebug.remote_host的设置不匹配.
xdebug.remote_cookie_expire_time
类型:integer(整型), 默认值: 3600, 在Xdebug 2.1 版中引进
该设置可以用来增加(或减少)远程调试会话的存活时间。
xdebug.remote_enable
类型:boolean(布尔型), 默认值: 0
该设置控制Xdebug是否应该尝试连接一个调试客户端,该调试客户端监听的主机和端口通过 xdebug.remote_host和 xdebug.remote_port配置项来设置. 如果不能建立到调试客户端的连接,脚本将继续执行,就像该设置被设置为0一样.
xdebug.remote_handler
类型:string(字符串), 默认值: dbgp
可以是’php3’,它将选择较老的PHP 3 风格调试器 输出;’gdb’,启用类似于GDB的调试器接口或者’dbgp’ – 调试器协议. DBGp协议被各种客户端广泛支持 查看远程调试以获取更多细节.
注意: Xdebug 2.1和以后的版本只支持’dbgp’协议.
xdebug.remote_host
类型:string(字符串), 默认值: localhost
选择运行调试客户端的主机, 你可以使用一个主机名或者一个IP地址. 如果xdebug.remote_connect_back被启用,此设置将被忽略.
xdebug.remote_log
类型:string(字符串), 默认值:
如果该项被设置为一个值, 它将被用作一个文件名,所有的远程调试通信信息将被记录在该文件中. 文件通过以追加模式打开因此先前的记录不会被覆盖. 没有提供并发保护机制. 文件的格式形如:
Log opened at 2007-05-27 14:28:15 -> <init xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/x ... ight></init> <- step_into -i 1 -> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/db ... ></response>
xdebug.remote_mode
类型:string(字符串), 默认值: req
当调试连接被初始化时选择调试模式.该设置有2个不同的值:
- req
- 一旦脚本开始执行,Xdebug就将尝试连接到调试客户端。
- jit
- 只有当错误发生时,Xdebug才会尝试连接到调试客户端。
xdebug.remote_port
类型:integer(整型), 默认值: 9000
Xdebug尝试连接的远程主机的端口. 默认情况下,第三方调试客户端和绑定的调试客户端 的端口都是9000.由于有许多客户端都使用这个端口号,最好不要修改默认值.
xdebug.scream
类型: boolean(布尔型), 默认值: 0, 在Xdebug 2.1版中引进
如果此项设置为1,Xdebug将禁用@操作符,那么php的错误提示信息将无法被隐藏。
xdebug.show_exception_trace
类型: integer(整型), 默认值: 0
当此项设置为1时, 不关什么时候发生异常,Xdebug都将显示一个堆栈轨迹-即使已经捕捉到了异常。
xdebug.show_local_vars
类型: integer(整型), 默认值: 0
当此项设置为不等于0的值时,Xdebug在错误发生时生成的堆栈信息仍然将在最顶层显示所有变量的信息。注意,使用这个选项可能会生成很多信息,所以此参数默认是关闭的。
xdebug.show_mem_delta
类型: integer(整型), 默认值: 0
当此项设置为不等于0的值时,Xdebug生成的人类可读的轨迹文件将会显示函数调用间不同的内存使用情况。如果Xdebug被设置为生成机器可读的轨迹文件,那么将始终显示此信息。
xdebug.trace_enable_trigger
类型: boolean(布尔型), 默认值: 0, 在Xdebug 2.2
当此参数设置为1时, 你可以使用XDEBUG_TRACE GET/POST参数或者使用XDEBUG_TRACE参数设置一个cookie来触发轨迹文件的生成。 这会将轨迹数据写入轨迹文件目录。 如果要阻止Xdebug生成轨迹文件,你需要设置 xdebug.auto_trace参数为0。
xdebug.trace_format
类型:integer(整型), 默认值:0
轨迹文件的格式。
值 | 描述 |
---|---|
0 | 显示人类可读的轨迹文件内容: 时间索引, 内存使用, 内存增量 (如果xdebug.show_mem_delta参数被启用), 层级, 函数名, 函数参数 (如果xdebug.collect_params被启用), 文件名 和 行号. |
1 | 写入含有两种不同记录的计算机可读的格式。 有很多不同的记录可以用来进入或离开一个堆栈结构。下面的表格列出了每种类型的记录的相关栏目,栏目之间通过制表位隔开。 |
2 | 写入HTML格式的轨迹。 |
计算机可读格式的记录栏目:
记录类型 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
入口 | level | function # | always ‘0’ | time index | memory usage | function name | user-defined (1) or internal function (0) | name of the include/require file | filename | line number |
出口 | level | function # | always ‘1’ | time index | memory usage | empty |
查看函数轨迹章节的例子。
xdebug.trace_options
类型:integer(整型), 默认值:0
当设置为1时,后来的请求所产生的轨迹信息将会被附加至之前轨迹信息之后,而不会覆盖原信息。
xdebug.trace_output_dir
类型:string, 默认值:/tmp
轨迹输出文件所在目录,确保当前执行PHP脚本的用户拥有对该目录的写入权利。
xdebug.trace_output_name
类型:string, 默认值:trace.%c
轨迹文件的文件名。此设置使用特定的格式来命名轨迹文件,和sprintf()与strftime()十分类似。有若干格式可以用来命名轨迹文件,’.xt’后缀通常会自动添加。
可用的格式操作符有:
操作符 | 意义 | 示例格式 | 示例文件名 |
---|---|---|---|
%c | crc32 of the current working directory | trace.%c | trace.1258863198.xt |
%p | pid | trace.%p | trace.5174.xt |
%r | random number | trace.%r | trace.072db0.xt |
%s | script name 2 | cachegrind.out.%s | cachegrind.out._home_httpd_html_test_xdebug_test_php |
%t | timestamp (seconds) | trace.%t | trace.1179434742.xt |
%u | timestamp (microseconds) | trace.%u | trace.1179434749_642382.xt |
%H | $_SERVER[‘HTTP_HOST’] | trace.%H | trace.kossu.xt |
%R | $_SERVER[‘REQUEST_URI’] | trace.%R | trace._test_xdebug_test_php_var=1_var2=2.xt |
%U | $_SERVER[‘UNIQUE_ID’] 3 | trace.%U | trace.TRX4n38AAAEAAB9gBFkAAAAB.xt |
%S | session_id (from $_COOKIE if set) | trace.%S | trace.c70c1ec2375af58f74b390bbdd2a679d.xt |
%% | literal % | trace.%% | trace.%%.xt |
2 此操作符对轨迹文件名无效。
3 2.2版中引进,此操作符通过Apache的mod_unique_id module来设置。
xdebug.var_display_max_children
类型: integer(整型), 默认值: 128
此参数用于当使用xdebug_var_dump(), xdebug.show_local_vars或函数轨迹来显示变量时,控制数组子节点和对象属性的显示数量。
如果要取消限制,使用-1作为参数值。
此参数对通过原程调试功能发送给客户端的子节点的数量没有任何影响。
xdebug.var_display_max_data
类型:integer(整型), 默认值:512
此参数用于当使用xdebug_var_dump(), xdebug.show_local_vars或函数轨迹来显示变量时,控制被显示的字符串的最大长度。
如果要取消限制,使用-1作为参数值。
此参数对通过原程调试功能发送给客户端的数据的数量没有任何影响。
xdebug.var_display_max_depth
类型: integer(整型), 默认值: 3
此参数用于当使用xdebug_var_dump(), xdebug.show_local_vars或函数轨迹来显示变量时,控制数组元素和对象属性的最大嵌套层数。
你能选择的最大值是1023,你也可以设置参数值为-1,这样Xdebug将会自动选择1023。
此参数对通过远程调试功能发送给客户端的子节点的深度(译者注:深度是数据结构上的概念)没有任何影响。