[TOC]
# 安装
本节介绍如何安装Xdebug。
## 预编译的Windows模块
有一些适用于Windows的预编译模块,它们都适用于PHP的非调试版本。您可以在[下载](https://xdebug.org/download.php)页面获取这些内容。按照[这些说明](https://xdebug.org/wizard.php)安装Xdebug。
## PECL安装
从Xdebug 0.9.0开始,您可以通过PEAR/PECL安装Xdebug。这仅适用于PEAR版本0.9.1-dev或更高版本以及某些UNIX。
使用PEAR/PECL安装非常简单:
```bash
# pecl install xdebug
```
你还需要在php.ini中添加正确的行:(不要忘记将路径和文件名更改为正确的行 - 但请确保使用**完整路径**)
```ini
zend_extension="/usr/local/php/modules/xdebug.so"
```
**注意:**您应该忽略任何提示将“extension = xdebug.so”添加到php.ini - 这将导致问题。
## 在Mac OS X上安装
PHP可以从非官方的Mac OS X包管理器Homebrew中获得。Homebrew建议使用PECL安装Xdebug,因此请按照上面的说明通过PECL进行安装。
## 从源码安装
您可以下载最新稳定版2.6.0的源代码。或者你可以从GIT获得Xdebug:
```bash
git clone git://github.com/xdebug/xdebug.git
```
这将检查最新的开发版本,目前是2.7.0alpha1。您还可以在https://github.com/derickr/xdebug上浏览源代码。
## 编译
有一个向导可以为您提供要下载的正确文件以及要使用的路径。
您可以从PHP的其余部分单独编译Xdebug。但请注意,您需要访问脚本'phpize'和'php-config'。如果你的系统没有'phpize'和'php-config',你需要首先从源tarball编译和安装PHP,因为这些脚本是PHP编译和安装过程的副产品。(Debian用户可以使用`apt-get install php5-dev`安装所需的工具)。由于PHP版本之间存在轻微但重要的差异,因此源版本与已安装的版本匹配非常重要。一旦您可以访问'phpize'和'php-config',请执行以下操作:
1. 解压缩压缩包:`tar -xzf xdebug-2.6.0.tgz`。请注意,您不需要在PHP源代码树中解压缩包。如上所述,Xdebug是单独编译的。
2. `cd xdebug-2.6.0`
3. 运行phpize:phpize(如果phpize不在你的路径中,则为`/path/to/phpize`)。确保使用属于您要使用Xdebug的PHP版本的phpize。如果您在查找要使用的phpize时遇到一些问题,请参阅此FAQ条目。
4. `./configure --enable-xdebug`
5. `make`
6. `make install`
## 配置PHP以使用Xdebug
1. 将以下行添加到php.ini:`zend_extension ="/wherever/you/put/it/xdebug.so"`。对于早于5.3的PHP版本和PHP(Apache 2 worker MPM或ISAPI模块)的线程使用,请添加:`zend_extension_ts ="/wherever/you/put/it/xdebug.so"`。注意:如果您自己编译PHP并使用--enable-debug,则必须使用zend_extension_debug =。注意:如果要同时使用Xdebug和OPCache,则必须在OPCache之后加载Xdebug。否则,它们将无法正常工作。从PHP 5.3开始,您始终需要使用zend_extension PHP.ini设置名称,而不是zend_extension_ts,也不需要使用zend_extension_debug。但是,您的编译选项(ZTS /正常构建;调试/非调试)仍然需要与PHP使用的匹配。
2. 重启您的网络服务器。
3. 编写一个调用'phpinfo()'的PHP页面将其加载到浏览器中并查找Xdebug模块上的信息。如果您在Zend徽标旁边看到它,那么您已经成功了!如果你有PHP的命令行版本,你也可以使用'php -m',它列出了所有加载的模块。Xdebug应该出现两次(一次在'PHP Modules'下面,一次在'Zend Modules'下)。
## 兼容性
Xdebug不能与Zend Optimizer或任何其他处理PHP内部(DBG,APD,ioncube等)的扩展一起使用。这是由于这些模块的兼容性问题。
## Debug客户端安装
解压缩Xdebug源码压缩包并发出以下命令:
```bash
$ cd debugclient
$ ./configure --with-libedit
$ make
# make install
```
这将在/usr/local/bin中安装debugclient二进制文件,除非您的系统上没有安装libedit。您可以安装它,也可以省略'--with-libedit'选项进行配置。Debian'unstable'用户可以使用`apt-get install libedit-dev libedit2`安装库。
如果configure脚本找不到libedit,并且您确定已正确安装(并且它的标头),并且您在configure.log中收到如下所示的链接错误:
```
/usr/lib64/libedit.so: undefined reference to `tgetnum'
/usr/lib64/libedit.so: undefined reference to `tgoto'
/usr/lib64/libedit.so: undefined reference to `tgetflag'
/usr/lib64/libedit.so: undefined reference to `tputs'
/usr/lib64/libedit.so: undefined reference to `tgetent'
/usr/lib64/libedit.so: undefined reference to `tgetstr'
collect2: ld returned 1 exit status
```
您需要将configure命令更改为:
```bash
$ LDFLAGS=-lncurses ./configure --with-libedit
```
# 基础特性
## 相关设置
**xdebug.default_enable**
类型:布尔值,默认值:1
如果此设置为1,则默认情况下将在错误事件中显示踪迹。您可以使用`xdebug_disable()`禁用显示代码中的堆栈跟踪。由于这是Xdebug的基本功能之一,建议将此设置保留为1。
**xdebug.force_display_errors**
类型:int,默认值:0,在Xdebug>=2.3中引入
如果此设置设置为1,则无论PHP的[display_errors](http://php.net/manual/zh/errorfunc.configuration.php#ini.display-errors)设置如何,都将始终显示错误。
**xdebug.force_error_reporting**
类型:int,默认值:0,在Xdebug>=2.3中引入
此设置是一个位掩码,如[error_reporting](http://php.net/manual/zh/errorfunc.configuration.php#ini.error-reporting)。该位掩码将与[error_reporting](http://php.net/manual/zh/errorfunc.configuration.php#ini.error-reporting)表示的位掩码进行逻辑OR运算,以便显示错误。此设置只能在php.ini中进行,并允许您强制显示某些错误,无论应用程序使用[ini_set()](http://php.net/manual/zh/function.ini-set.php)做什么。
**xdebug.halt_level**
类型:int,默认值:0,在Xdebug>=2.3中引入
此设置允许您配置一个掩码,用于确定是否以及哪些通知和/或警告转换为错误。您可以配置由PHP生成的通知和警告,以及您自己生成的通知和警告(通过`trigger_error()`)。例如,要将`strlen()`(不带参数)的警告转换为错误,您可以执行以下操作:
```php
ini_set('xdebug.halt_level', E_WARNING);
strlen();
echo "Hi!\n";
```
然后,这将导致显示错误消息,以及脚本的中止。`echo "Hi!\n";`不会被执行。
该设置是一个位掩码,因此要将所有通知和警告转换为所有应用程序的错误,您可以在php.ini中设置:
```ini
xdebug.halt_level=E_WARNING|E_NOTICE|E_USER_WARNING|E_USER_NOTICE
```
位掩码只支持上面提到的四个级别。
**xdebug.max_nesting_level**
类型:int,默认值:256
控制无限递归保护的保护机制。此设置的值是在中止脚本之前允许的嵌套函数的最大级别。
在Xdebug 2.6之前,如果超出,这将产生fatal异常。从Xdebug 2.6及更高版本开始,将引发“[ERROR](http://php.net/manual/en/class.error.php)”异常。
在Xdebug 2.3之前,默认值为`100`。
**xdebug.max_stack_frames**
类型:整数,默认值:-1,在Xdebug>=2.3中引入
控制堆栈跟踪中显示的堆栈帧数,在PHP错误堆栈跟踪期间在命令行上以及在HTML跟踪的浏览器中显示。
**xdebug.scream**
类型:布尔值,默认值:0,在Xdebug>=2.1中引入
如果此设置为1,则Xdebug将禁用@(关闭)运算符,以便不再隐藏通知,警告和错误。
## 相关函数
***string xdebug_call_class( [int $depth = 1] )***
*返回调用类,如果堆栈帧不存在,则返回NULL;如果堆栈帧没有类信息,则返回FALSE*
此函数返回定义当前方法的类的名称,如果没有与此调用关联的类,则返回FALSE。
```php
# 示例
<?php
class Strings
{
static function fix_string($a)
{
echo
xdebug_call_class().
"::".
xdebug_call_function().
" is called at ".
xdebug_call_file().
":".
xdebug_call_line();
}
}
$ret = Strings::fix_string( 'Derick' );
?>
```
```bash
# 返回
Called @ /home/httpd/html/test/xdebug_caller.php:17 from ::{main}
```
要从早期堆栈帧中检索信息,请使用可选的`$depth`参数。值为`1`将返回执行`xdebug_call_class()`的方法的调用信息:
```php
# 示例
<?php
class Strings
{
static function fix_string( $a )
{
echo
xdebug_call_class( 1 ).
"::".
xdebug_call_function( 1 ).
" is called at ".
xdebug_call_file( 1 ).
":".
xdebug_call_line( 1 );
}
}
$ret = Strings::fix_string( 'Derick' );
?>
```
```bash
# 返回
Strings::fix_string is called at /home/httpd/html/test/xdebug_caller:17
```
值`2`(默认值)返回当前方法的“grand parent”的调用信息:
```php
# 示例
<?php
class Strings
{
static function fix_string( $a )
{
echo
xdebug_call_class( 2 ).
"::".
xdebug_call_function( 2 ).
" is called at ".
xdebug_call_file( 2 ).
":".
xdebug_call_line( 2 );
}
static function fix_strings( array $a )
{
foreach ( $a as $element )
{
self::fix_string( $a );
}
}
}
$ret = Strings::fix_strings( [ 'Derick' ] );
?>
```
```bash
# 返回
Strings::fix_strings is called at /home/httpd/html/test/xdebug_caller:25
```
值`0`将调用的调用信息返回到相应的`xdebug_call_*`方法:
```php
# 示例
<?php
class Strings
{
static function fix_string( $a )
{
echo
xdebug_call_class( 0 ).
"::".
xdebug_call_function( 0 ).
" is called at ".
xdebug_call_file( 0 ).
":".
xdebug_call_line( 0 );
}
static function fix_strings( array $a )
{
foreach ( $a as $element )
{
self::fix_string( $a );
}
}
}
$ret = Strings::fix_strings( [ 'Derick' ] );
?>
```
```bash
# 返回
::xdebug_call_function is called at /home/httpd/html/test/xdebug_caller:13
```
***string xdebug_call_file( [int $depth = 1] )***
*返回调用文件,如果堆栈帧不存在,则返回`NULL`*
此函数返回执行当前函数/方法的文件名。
要从早期堆栈帧中检索信息,请使用可选的`$depth`参数。
有关示例和更多信息,请参阅`xdebug_call_class()`。
***string xdebug_call_function( [int $depth = 1] )***
*返回调用函数/方法,如果堆栈帧不存在则返回`NULL`,如果堆栈帧没有函数/方法信息则返回`FALSE`*
此函数返回当前函数/方法的名称。
要从早期堆栈帧中检索信息,请使用可选的`$depth`参数。
有关示例和更多信息,请参阅`xdebug_call_class()`。
***int xdebug_call_line( [int $depth = 1] )***
*返回调用行号,如果堆栈帧不存在,则返回`NULL`*
此函数返回调用当前函数/方法的行号。
要从早期堆栈帧中检索信息,请使用可选的`$depth`参数。
有关示例和更多信息,请参阅`xdebug_call_class()`。
***void xdebug_disable()***
*禁用堆栈跟踪*
禁用在错误条件下显示堆栈跟踪。
***void xdebug_enable()***
*启用堆栈跟踪*
启用在错误条件下显示堆栈跟踪。
***string xdebug_get_collected_errors( [int clean] )***
*返回收集的所有错误消息*
*在2.1版中引入*
此函数返回集合缓冲区中的所有错误,其中包含使用`xdebug_start_error_collection()`启动错误集合时存储的所有错误。
默认情况下,此函数不会清除错误收集缓冲区。如果将true作为参数传递给此函数,则缓冲区也将被清除。
此函数返回一个字符串,其中包含格式化为“Xdebug表”的所有收集的错误。
***array xdebug_get_headers()***
*返回通过调用PHP的header()函数设置的所有标头*
*在2.1版中引入*
返回使用PHP的header()函数设置的所有头,或者在PHP内部设置的任何其他头(例如通过setcookie())作为数组。
```php
# 示例
<?php
header( "X-Test", "Testing" );
setcookie( "TestCookie", "test-value" );
var_dump( xdebug_get_headers() );
?>
```
```bash
# 返回
array(2) {
[0]=>
string(6) "X-Test"
[1]=>
string(33) "Set-Cookie: TestCookie=test-value"
}
```
***bool xdebug_is_enabled()***
*返回是否启用堆栈跟踪*
返回是否在出现错误时显示堆栈跟踪。
***int xdebug_memory_usage()***
*返回当前内存使用情况*
返回脚本使用的当前内存量。在PHP 5.2.1之前,这只适用于使用--enable-memory-limit编译PHP的情况。从PHP 5.2.1及更高版本开始,此功能始终可用。
***int xdebug_peak_memory_usage()***
*返回峰值内存使用情况*
返回脚本到目前为止使用的最大内存量。在PHP 5.2.1之前,这只适用于使用--enable-memory-limit编译PHP的情况。从PHP 5.2.1及更高版本开始,此功能始终可用。
***void xdebug_start_error_collection()***
*开始记录所有通知,警告和错误并阻止其显示*
*在2.1版中引入*
执行此函数时,Xdebug将导致PHP不显示任何通知,警告或错误。相反,它们根据Xdebug的常规错误格式化规则(即带有红色感叹号的错误表)进行格式化,然后存储在缓冲区中。这将继续,直到您调用`xdebug_stop_error_collection()`。
可以通过调用`xdebug_get_collected_errors()`来检索此缓冲区的内容,然后显示。如果您想要阻止Xdebug强大的错误报告功能破坏您的布局,这非常有用。
***void xdebug_stop_error_collection()***
*停止记录`xdebug_start_error_collection()`启动的所有通知,警告和错误*
*在2.1版中引入*
执行此函数时,将中止由`xdebug_start_error_collection()`启动的错误收集。存储在集合缓冲区中的错误不会被删除,仍然可以通过`xdebug_get_collected_errors()`获取。
***float xdebug_time_index()***
*返回当前时间索引*
返回自脚本启动以来的当前时间索引(以秒为单位)。
```php
# 示例
<?php
echo xdebug_time_index(), "\n";
for ($i = 0; $i < 250000; $i++)
{
// do nothing
}
echo xdebug_time_index(), "\n";
?>
```
```bash
# 返回
0.00038003921508789
0.76580691337585
```
# 可变显示特性
Xdebug替换了PHP的var_dump()函数来显示变量。Xdebug的版本包含不同类型的不同颜色,并限制数组元素/对象属性的数量,最大深度和字符串长度。还有一些其他功能处理变量显示。
## 设置对var_dump()的影响
有许多设置可以控制Xdebug修改后的var_dump()函数的输出:xdebug.var_display_max_children,xdebug.var_display_max_data和xdebug.var_display_max_depth。通过示例最好地显示这三个设置的效果。下面的脚本运行四次,每次都有不同的设置。您可以使用选项卡查看差异。
### 脚本
```php
<?php
class test {
public $pub = false;
private $priv = true;
protected $prot = 42;
}
$t = new test;
$t->pub = $t;
$data = array(
'one' => 'a somewhat long string!',
'two' => array(
'two.one' => array(
'two.one.zero' => 210,
'two.one.one' => array(
'two.one.one.zero' => 3.141592564,
'two.one.one.one' => 2.7,
),
),
),
'three' => $t,
'four' => range(0, 5),
);
var_dump( $data )
```
### 结果
- *default*
- *children=2*
- *data=16*
- *depth=2*
- *children=3, data=8, depth=1*
```html
array
'one' => string 'a somewhat long string!' (length=23)
'two' =>
array
'two.one' =>
array
'two.one.zero' => int 210
'two.one.one' =>
array
...
'three' =>
object(test)[1]
public 'pub' =>
&object(test)[1]
private 'priv' => boolean true
protected 'prot' => int 42
'four' =>
array
0 => int 0
1 => int 1
2 => int 2
3 => int 3
4 => int 4
5 => int 5
array
'one' => string 'a somewhat long string!' (length=23)
'two' =>
array
'two.one' =>
array
'two.one.zero' => int 210
'two.one.one' =>
array
...
more elements...
array
'one' => string 'a somewhat long '... (length=23)
'two' =>
array
'two.one' =>
array
'two.one.zero' => int 210
'two.one.one' =>
array
...
'three' =>
object(test)[1]
public 'pub' =>
&object(test)[1]
private 'priv' => boolean true
protected 'prot' => int 42
'four' =>
array
0 => int 0
1 => int 1
2 => int 2
3 => int 3
4 => int 4
5 => int 5
array
'one' => string 'a somewhat long string!' (length=23)
'two' =>
array
'two.one' =>
array
...
'three' =>
object(test)[1]
public 'pub' =>
&object(test)[1]
private 'priv' => boolean true
protected 'prot' => int 42
'four' =>
array
0 => int 0
1 => int 1
2 => int 2
3 => int 3
4 => int 4
5 => int 5
array
'one' => string 'a somewh'... (length=23)
'two' =>
array
...
'three' =>
object(test)[1]
...
more elements...
```
# 堆栈跟踪
当Xdebug被激活时,只要PHP决定显示notice,notice,error等,它就会显示堆栈跟踪。堆栈跟踪显示的信息及其显示方式可以根据您的需要进行配置。
Xdebug在错误情况下显示的堆栈跟踪(如果[display.errors](http://www.php.net/manual/zh/ref.errorfunc.php#ini.display-errors)在php.ini中设置为On),它们显示的信息量非常保守。这是因为大量信息会降低脚本的执行速度以及在浏览器中呈现堆栈跟踪本身的速度。但是,可以使堆栈跟踪显示具有不同设置的更详细信息。
## 堆栈跟踪中的变量
默认情况下,Xdebug现在将在其生成的堆栈跟踪中显示变量信息。收集或显示时,可变信息可能需要相当多的资源。但是,在许多情况下,显示变量信息很有用,这就是Xdebug具有`xdebug.collect_params`设置的原因。下面的示例中显示了下面的脚本,以及使用此设置的不同值的输出结果。
### 脚本
```php
<?php
function foo( $a ) {
for ($i = 1; $i < $a['foo']; $i++) {
if ($i == 500000) xdebug_break();
}
}
set_time_limit(1);
$c = new stdClass;
$c->bar = 100;
$a = array(
42 => false, 'foo' => 912124,
$c, new stdClass, fopen( '/etc/passwd', 'r' )
);
foo( $a );
?>
```
### 结果
`xdebug.collect_params`设置的不同值给出不同的输出,您可以在下面看到:
# 函数跟踪
# 代码覆盖率分析
代码覆盖率告诉您在请求期间执行了哪些脚本(或脚本集)。有了这些信息,您可以了解您的单元测试有多好。
Xdebug的代码覆盖功能通常与[PHP_CodeCoverage](https://github.com/sebastianbergmann/php-code-coverage)结合使用,作为[PHPUnit](https://phpunit.de/)运行的一部分。
PHPUnit将代码覆盖率集合委托给Xdebug。它通过`xdebug_start_code_coverage()`和`xdebug_stop_code_coverage()`为每个测试启动和停止代码覆盖,并使用`xdebug_get_code_coverage()`来检索结果。
代码覆盖率的主要输出是一个数组,详细说明在运行代码覆盖率集合处于活动状态的代码时,哪些文件已被“命中”。但代码覆盖功能还可以在产生额外性能影响的情况下分析哪些代码行上有可执行代码,哪些代码行实际可以被命中(死代码分析),还可以进行检测以找出哪些分支并遵循功能和方法中的路径。`xdebug_start_code_coverage()`函数记录了各种选项。
## 过滤
Xdebug 2.6引入了代码覆盖的过滤功能。使用过滤器,您可以通过白名单包括,或通过黑名单排除,在代码覆盖率收集期间分析路径或类名前缀。一个典型的用例是将过滤器配置为仅包含您的`src/`文件夹,以便Xdebug的代码覆盖率分析不会尝试分析测试,Composer依赖项或PHPUnit/PHP_CodeCoverage本身。如果正确配置过滤器,则可以预期代码覆盖率运行速度提高2倍[[1](https://twitter.com/jrf_nl/status/955017446674616320),[2](https://twitter.com/hollodotme/status/953719914686242816),[3](https://twitter.com/WyriHaximus/status/953667730003001344)]。
过滤器的工作原理是根据配置的过滤器标记每个可执行单元(函数,方法,文件)。Xdebug只能在第一次包含/需要特定的可执行单元时才这样做,因为当PHP首次解析和编译文件时会发生过滤。Xdebug需要这样做,因为这也是在分析哪些路径可以运行以及哪些行不能执行时。此时标记可执行单元,也意味着每次Xdebug想要计算要包含在代码覆盖率中的行时,都不必运行过滤器。因此,在包含/需要代码之前设置过滤器非常重要。目前最好通过PHP的[auto_prepend_file](http://php.net/manual/zh/ini.core.php#ini.auto-prepend-file)设置通过自动预置文件来完成。
要设置仅对`src/`文件夹进行代码覆盖率分析的过滤器,可以使用以下命令调用`xdebug_set_filter()`:
```php
# 示例
<?php
xdebug_set_filter(
XDEBUG_FILTER_CODE_COVERAGE,
XDEBUG_PATH_WHITELIST,
[ __DIR__ . DIRECTORY_SEPARATOR . "src" . DIRECTORY_SEPARATOR ]
);
?>
```
设置此过滤器后,代码覆盖率信息将仅包含位于此文件所在文件的`src/`子目录中的函数,方法和文件。您可以通过调用以告诉PHP添加此前置文件:
```bash
php -dauto_prepend_file=xdebug_filter.php yourscript.php
```
或者与PHPUnit结合使用,当通过Composer安装时,使用:
```ba's
php -dauto_prepend_file=xdebug_filter.php vendor/bin/phpunit
```
`xdebug_set_filter()`参数的完整文档在其自己的文档页面中进行了描述。
## 相关设置
**xdebug.coverage_enable**
类型:布尔值,默认值:1,在Xdebug>=2.2中引入
如果此设置设置为0,则Xdebug将不会设置内部结构以允许代码覆盖。这加快了Xdebug的速度,但当然,Code Coverage Analysis不起作用。
## 相关函数
***boolean xdebug_code_coverage_started()***
*返回代码覆盖是否有效。*
返回是否已启动代码覆盖率。
```php
# 示例
<?php
var_dump(xdebug_code_coverage_started());
xdebug_start_code_coverage();
var_dump(xdebug_code_coverage_started());
?>
```
```bash
# 返回
bool(false)
bool(true)
```
***array xdebug_get_code_coverage()***
*返回代码覆盖率信息*
# 垃圾收集统计
Xdebug的内置垃圾收集统计分析器允许您查明PHP内部垃圾收集器何时触发,清理了多少变量,耗时多长,以及实际释放了多少内存。
## 介绍
*Xdebug 2.6中的新功能*
PHP中的垃圾收集(GC)会对内存和性能产生严重影响,因此了解它何时被触发以及每次运行的效率如何,都可以优化您的程序。PHP引擎不提供收集有关垃圾收集的统计信息的机制,但Xdebug现在可以。
目前,垃圾收集统计信息仅以人类可读的表格格式收集,因为我们无法为此类报告生成机器可读输出的工具。未来版本可能包括其他格式的导出以允许机器处理。
## 用法
有两种方法可以用两种不同的用例开始收集GC统计数据。第一个是完全通过INI设置,主要用例是收集单个CLI脚本运行的统计信息(GC通常是个问题)。
```bash
php -dxdebug.gc_stats_enable=1 your_script.php
```
如果要收集执行的每个脚本的垃圾收集统计信息,可以在系统或目录级别设置`xdebug.gc_stats_enable` INI设置。请注意,即使垃圾收集器未运行,全局激活集合也会为每个已执行的脚本生成输出文件。
第二种开始收集的方法是直接在PHP脚本中调用函数`xdebug_start_gcstats()`。这使您可以更好地控制何时开始统计信息收集。
您可以通过调用`xdebug_stop_gcstats()`来停止INI和基于函数的方法的收集。
## 表格文字(人类可读)
垃圾收集统计信息的默认(仅限于现在)输出格式是表格人类可读文本输出。
```
Garbage Collection Report
version: 1
creator: xdebug 2.6.0 (PHP 7.2.0)
```
```
Collected | Efficiency% | Duration | Memory Before | Memory After | Reduction% | Function
----------+-------------+----------+---------------+--------------+------------+---------
10000 | 100.00 % | 0.00 ms | 5539880 | 579880 | 79.53 % | bar
10000 | 100.00 % | 0.00 ms | 5540040 | 580040 | 79.53 % | Garbage::produce
4001 | 40.01 % | 0.00 ms | 2563048 | 578968 | 77.41 % |gc_collect_cycles
```
标头包含报告的版本以及生成它的Xdebug的版本。
然后,表本身为每个垃圾收集运行包含一行,每行包含7个报告的变量:
- **Collected** — 在此次运行期间被垃圾收集的所谓“root”的数量。“root”是一个PHP对象(实例)或垃圾收集器正在观察的数组,用于潜在的清理。
- **Efficiency%** — 清除根的数量是否除以10 000 - 达到时神奇数量的“根”会触发PHP内部垃圾收集器自动运行。
- **Duration** — 表示此垃圾回收运行所用的持续时间(以毫秒为单位)。
- **Memory Before** — 包含在激活此GC运行之前由`memory_get_usage()`测量的内存。
- **Memory After** — 包含GC运行完成后由`memory_get_usage()`测量的内存。
- **Reduction%** — 此GC运行导致的内存减少百分比。
- **Function** — 触发GC运行的函数或方法的名称。如果是`gc_collect_cycles()`,则表示已明确触发垃圾收集器。所有其他值表明由于PHP引擎的10 000“根”达到度量标准,GC被隐式触发。
有关PHP垃圾收集工作原理的详细信息,请参阅有关[垃圾收集的PHP手册章节](http://php.net/manual/zh/features.gc.php)。
## 相关设置
**xdebug.gc_stats_enable**
类型:bool,默认值:false,在Xdebug >= 2.6中引入
如果启用此设置,则垃圾收集运行的统计信息将自动收集到使用`xdebug.gc_stats_output_dir`设置的给定目录中,并使用由`xdebug.gc_stats_output_name`配置的自动生成的名称。
# 分析PHP脚本
Xdebug的内置分析器允许您在脚本中找到瓶颈,并使用外部工具(如KCacheGrind或WinCacheGrind)可视化这些瓶颈。
## 介绍
Xdebug的Profiler是一个功能强大的工具,它使您能够分析PHP代码并确定瓶颈,或者通常可以看到代码的哪些部分很慢并且可以使用速度提升。从Xdebug 2.6开始,探查器还会收集有关正在使用多少内存的信息,以及aGnd方法增加内存使用量的功能。
Xdebug中的探查器以Cachegrind兼容文件的形式输出分析信息。这允许您使用优秀的[KCacheGrind](https://kcachegrind.github.io/)工具(Linux,KDE)来分析您的分析数据。如果您使用的是Linux,则可以使用您喜欢的软件包管理器安装KCacheGrind。
如果您使用的是Windows,则可以使用预编译的[QCacheGrind](http://sourceforge.net/projects/qcachegrindwin/)二进制文件。(QCacheGrind是没有KDE绑定的KCacheGrind)。
如果您使用的是Mac OSX,那么也有关于如何构建QCacheGrind的[说明](http://www.tekkie.ro/computer-setup/how-to-install-kcachegrind-qcachegrind-on-mac-osx/)。
# 远程调试
# 常问问题
待续...